From 935145d46b47507cb3a6c95db469504e6d3eb469 Mon Sep 17 00:00:00 2001
From: Ben Carman <benthecarman@live.com>
Date: Wed, 29 Jul 2020 17:07:00 -0500
Subject: [PATCH] Introduces Adaptor Signature based Discreet Log Contracts to
 Bitcoin-S

Fixed things after rebase

Fix adaptor dlc compile issue (#2188)

No more Maps in ContractInfo (#2215)

Co-authored-by: Ben Carman <benthecarman@live.com>

Remove Unneeded Escaped param for DLC Cli (#2213)

Fixed backward stack usage in dlc things (#2218)

Made test for DLCMessage Json serialization symmetry (#2225)

2020 10 31 Fix indeterminism with pairing dlc funding puts with funding transactions (#2227)

* WIP

* Fix indeterminism with matching DLCFundingInputDb with their funding transactions

* Remove unused imports

* Replace all other instances of .zip() in DLCWallet

Properly track DLC transactions in wallet (#2201)

* Properly track DLC transactions in wallet

* Small cleanups

DLCStatus Table in GUI (#2203)

* DLC Table View & Inspect DLC

* Move to new file, clean up asInstanceOfs

* Update DLCs on View

* Rebase fixes

Generalize dlc builders (#2206)

Co-authored-by: nkohen <nadavk25@gmail.com>
Co-authored-by: Ben Carman <benthecarman@live.com>

DLC Wallet & GUI touch ups (#2305)

* DLC Wallet & GUI touch ups

* Rename back to DLCStatus

* Only create dummy oracle on test networks

* Bring up Oracle TLVs

* Use announcement instead of oracle info

* Fix names, compile issue, assert we can safely delete sigs

* Fix TLV parsing for non-standard strings

* Fix RoutesSpec

Give raw tx, tx data, and link to broadcast for txs (#2340)

* Give raw tx, tx data, and link to broadcast for txs

* Change format
---
 ...Linux_2.12_KeyManager_Wallet_DLC_Tests.yml |    2 +-
 ...Linux_2.13_KeyManager_Wallet_DLC_Tests.yml |    2 +-
 .../Mac_2.13_Wallet_Node_DLC_Tests.yml        |    2 +-
 .../bitcoins/commons/dlc/DLCMessageTest.scala |   26 +
 .../dlc-suredbits-client-test.sbt             |    3 +
 .../org/bitcoins/sbclient/MockServer.scala    |  133 +
 .../org/bitcoins/sbclient/RegexUtil.scala     |   36 +
 .../org/bitcoins/sbclient/SbClientTest.scala  |  124 +
 .../dlc-suredbits-client.sbt                  |    3 +
 .../scala/org/bitcoins/sbclient/Asset.scala   |   44 +
 .../org/bitcoins/sbclient/Exchange.scala      |  129 +
 .../sbclient/InvoiceAndDataResponse.scala     |   10 +
 .../org/bitcoins/sbclient/RequestType.scala   |   18 +
 .../org/bitcoins/sbclient/SbClient.scala      |  149 +
 .../org/bitcoins/sbclient/TradingPair.scala   |  538 +
 .../scala/org/bitcoins/gui/GlobalData.scala   |   23 +-
 .../org/bitcoins/gui/dlc/DLCPaneModel.scala   |   34 +-
 .../org/bitcoins/server/RoutesSpec.scala      |  352 +-
 .../org/bitcoins/wallet/MockWalletApi.scala   |    4 +-
 .../bitcoins/server/BitcoinSAppConfig.scala   |    5 +-
 .../bitcoins/server/BitcoinSServerMain.scala  |   14 +-
 .../server/BitcoindRpcBackendUtil.scala       |   27 +
 .../bitcoins/server/ServerJsonModels.scala    |  308 +-
 .../org/bitcoins/server/WalletRoutes.scala    |  229 +-
 build.sbt                                     |   74 +-
 .../org/bitcoins/core/util/MapWrapper.scala   |   11 +
 .../bitcoins/core/api/wallet/WalletApi.scala  |    2 +
 .../core/protocol/transaction/TxUtil.scala    |    2 +-
 .../org/bitcoins/core/psbt/PSBTMap.scala      |    2 +-
 .../org/bitcoins/db/DbManagementTest.scala    |   31 +
 db-commons/src/main/resources/reference.conf  |   16 +
 .../dlc/DLCClientIntegrationTest.scala        |  586 +
 .../org/bitcoins/dlc/DLCClientTest.scala      |  722 ++
 .../org/bitcoins/dlc/DLCFeeTestUtil.scala     |  116 +
 .../scala/org/bitcoins/dlc/SetupDLCTest.scala |   76 +
 .../dlc/testgen/DLCFeeTestVectorTest.scala    |   56 +
 .../testgen/DLCParsingTestVectorTest.scala    |   48 +
 .../dlc/testgen/DLCTestVectorTest.scala       |   37 +
 .../dlc/testgen/DLCTxTestVectorTest.scala     |   35 +
 .../SchnorrSigPointTestVectorTest.scala       |   40 +
 .../bitcoins/dlc/testgen/TestVectorUtil.scala |   32 +
 .../org/bitcoins/dlc/wallet/DLCDAOTest.scala  |  202 +
 .../dlc/wallet/DLCExecutionTest.scala         |  300 +
 .../wallet/DLCMultiNonceExecutionTest.scala   |  165 +
 .../dlc/wallet/WalletDLCSetupTest.scala       |  455 +
 .../dlc/migration/V1__dlc_db_baseline.sql     |   93 +
 .../dlc/migration/V2__add_outcome.sql         |    1 +
 .../dlc/migration/V1__dlc_db_baseline.sql     |   86 +
 .../sqlite/dlc/migration/V2__add_outcome.sql  |    1 +
 .../bitcoins/dlc/wallet/DLCAppConfig.scala    |  129 +
 .../bitcoins/dlc/wallet/DLCDbManagement.scala |   57 +
 .../org/bitcoins/dlc/wallet/DLCWallet.scala   | 1601 +++
 .../bitcoins/dlc/wallet/DLCWalletApi.scala    |   96 +
 .../dlc/wallet/models/DLCAcceptDAO.scala      |   99 +
 .../dlc/wallet/models/DLCAcceptDb.scala       |   74 +
 .../wallet/models/DLCCETSignatureDAO.scala    |  101 +
 .../dlc/wallet/models/DLCCETSignatureDb.scala |   12 +
 .../bitcoins/dlc/wallet/models/DLCDAO.scala   |  167 +
 .../bitcoins/dlc/wallet/models/DLCDb.scala    |   38 +
 .../wallet/models/DLCFundingInputDAO.scala    |  114 +
 .../dlc/wallet/models/DLCFundingInputDb.scala |   32 +
 .../dlc/wallet/models/DLCOfferDAO.scala       |  115 +
 .../dlc/wallet/models/DLCOfferDb.scala        |   68 +
 .../dlc/wallet/models/DLCRefundSigDAO.scala   |   93 +
 .../dlc/wallet/models/DLCRefundSigDb.scala    |    9 +
 .../dlc/wallet/models/DLCRemoteTxDAO.scala    |   60 +
 dlc/README.md                                 |    1 +
 .../bitcoins/dlc/builder/DLCCETBuilder.scala  |   79 +
 .../dlc/builder/DLCFundingTxBuilder.scala     |  109 +
 .../dlc/builder/DLCRefundTxBuilder.scala      |   66 +
 .../bitcoins/dlc/builder/DLCTxBuilder.scala   |  171 +
 .../bitcoins/dlc/execution/DLCExecutor.scala  |  100 +
 .../bitcoins/dlc/execution/DLCOutcome.scala   |   19 +
 .../org/bitcoins/dlc/execution/SetupDLC.scala |   34 +
 .../org/bitcoins/dlc/sign/DLCTxSigner.scala   |  307 +
 .../dlc/testgen/DLCFeeTestVector.scala        |  150 +
 .../dlc/testgen/DLCFeeTestVectorGen.scala     |   94 +
 .../dlc/testgen/DLCParsingTestVector.scala    |  442 +
 .../dlc/testgen/DLCParsingTestVectorGen.scala |   42 +
 .../org/bitcoins/dlc/testgen/DLCTLVGen.scala  |  398 +
 .../bitcoins/dlc/testgen/DLCTestUtil.scala    |  151 +
 .../bitcoins/dlc/testgen/DLCTestVector.scala  |  330 +
 .../dlc/testgen/DLCTestVectorGen.scala        |   38 +
 .../org/bitcoins/dlc/testgen/DLCTxGen.scala   |  277 +
 .../dlc/testgen/DLCTxTestVector.scala         |   30 +
 .../dlc/testgen/DLCTxTestVectorGen.scala      |   38 +
 .../testgen/SchnorrSigPointTestVector.scala   |   99 +
 .../SchnorrSigPointTestVectorGen.scala        |   46 +
 .../bitcoins/dlc/testgen/TestDLCClient.scala  |  209 +
 .../org/bitcoins/dlc/testgen/TestVector.scala |   19 +
 .../bitcoins/dlc/testgen/TestVectorGen.scala  |  121 +
 .../bitcoins/dlc/testgen/dlc_fee_test.json    | 9861 +++++++++++++++++
 .../dlc/testgen/dlc_fee_test_scripts.json     |   45 +
 .../dlc/testgen/dlc_message_test.json         |  124 +
 .../dlc/testgen/dlc_schnorr_test.json         |   51 +
 .../org/bitcoins/dlc/testgen/dlc_test.json    | 1996 ++++
 .../org/bitcoins/dlc/testgen/dlc_tx_test.json | 2110 ++++
 .../dlc/verify/DLCSignatureVerifier.scala     |  135 +
 inThisBuild.sbt                               |    2 +-
 .../keymanager/bip39/BIP39KeyManager.scala    |    5 +-
 project/Deps.scala                            |   26 +
 .../testkit/BitcoinSTestAppConfig.scala       |    3 +-
 .../testkit/core/gen/LnMessageGen.scala       |   16 +
 .../bitcoins/testkit/core/gen/TLVGen.scala    |   79 +-
 .../testkit/eclair/MockEclairClient.scala     |  571 +
 .../testkit/fixtures/DLCDAOFixture.scala      |   63 +
 .../org/bitcoins/testkit/util/BytesUtil.scala |   25 +
 .../wallet/BitcoinSDualWalletTest.scala       |  107 +
 .../testkit/wallet/BitcoinSWalletTest.scala   |   68 +-
 .../testkit/wallet/DLCWalletUtil.scala        |  286 +
 .../testkit/wallet/FundWalletUtil.scala       |   48 +-
 .../scala/org/bitcoins/wallet/Wallet.scala    |   35 +-
 .../wallet/config/WalletAppConfig.scala       |    2 +-
 .../internal/FundTransactionHandling.scala    |    2 +-
 .../wallet/models/TransactionDAO.scala        |    8 +-
 115 files changed, 27207 insertions(+), 100 deletions(-)
 create mode 100644 app/dlc-suredbits-client-test/dlc-suredbits-client-test.sbt
 create mode 100644 app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/MockServer.scala
 create mode 100644 app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/RegexUtil.scala
 create mode 100644 app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/SbClientTest.scala
 create mode 100644 app/dlc-suredbits-client/dlc-suredbits-client.sbt
 create mode 100644 app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/Asset.scala
 create mode 100644 app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/Exchange.scala
 create mode 100644 app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/InvoiceAndDataResponse.scala
 create mode 100644 app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/RequestType.scala
 create mode 100644 app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/SbClient.scala
 create mode 100644 app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/TradingPair.scala
 create mode 100644 core/src/main/scala-2.11/org/bitcoins/core/util/MapWrapper.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/DLCClientIntegrationTest.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/DLCClientTest.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/DLCFeeTestUtil.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/SetupDLCTest.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCFeeTestVectorTest.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCParsingTestVectorTest.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCTestVectorTest.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCTxTestVectorTest.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVectorTest.scala
 create mode 100644 dlc-test/src/test/scala/org/bitcoins/dlc/testgen/TestVectorUtil.scala
 create mode 100644 dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCDAOTest.scala
 create mode 100644 dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCExecutionTest.scala
 create mode 100644 dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCMultiNonceExecutionTest.scala
 create mode 100644 dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/WalletDLCSetupTest.scala
 create mode 100644 dlc-wallet/src/main/resources/postgresql/dlc/migration/V1__dlc_db_baseline.sql
 create mode 100644 dlc-wallet/src/main/resources/postgresql/dlc/migration/V2__add_outcome.sql
 create mode 100644 dlc-wallet/src/main/resources/sqlite/dlc/migration/V1__dlc_db_baseline.sql
 create mode 100644 dlc-wallet/src/main/resources/sqlite/dlc/migration/V2__add_outcome.sql
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCAppConfig.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCDbManagement.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCWallet.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCWalletApi.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCAcceptDAO.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCAcceptDb.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCCETSignatureDAO.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCCETSignatureDb.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCDAO.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCDb.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCFundingInputDAO.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCFundingInputDb.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCOfferDAO.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCOfferDb.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRefundSigDAO.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRefundSigDb.scala
 create mode 100644 dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRemoteTxDAO.scala
 create mode 100644 dlc/README.md
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/builder/DLCCETBuilder.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/builder/DLCFundingTxBuilder.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/builder/DLCRefundTxBuilder.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/builder/DLCTxBuilder.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/execution/DLCExecutor.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/execution/DLCOutcome.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/execution/SetupDLC.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/sign/DLCTxSigner.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCFeeTestVector.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCFeeTestVectorGen.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCParsingTestVector.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCParsingTestVectorGen.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTLVGen.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestUtil.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestVector.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestVectorGen.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxGen.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxTestVector.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxTestVectorGen.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVector.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVectorGen.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/TestDLCClient.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/TestVector.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/TestVectorGen.scala
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test.json
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test_scripts.json
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_message_test.json
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_schnorr_test.json
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_test.json
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_tx_test.json
 create mode 100644 dlc/src/main/scala/org/bitcoins/dlc/verify/DLCSignatureVerifier.scala
 create mode 100644 testkit/src/main/scala/org/bitcoins/testkit/eclair/MockEclairClient.scala
 create mode 100644 testkit/src/main/scala/org/bitcoins/testkit/fixtures/DLCDAOFixture.scala
 create mode 100644 testkit/src/main/scala/org/bitcoins/testkit/util/BytesUtil.scala
 create mode 100644 testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSDualWalletTest.scala
 create mode 100644 testkit/src/main/scala/org/bitcoins/testkit/wallet/DLCWalletUtil.scala

diff --git a/.github/workflows/Linux_2.12_KeyManager_Wallet_DLC_Tests.yml b/.github/workflows/Linux_2.12_KeyManager_Wallet_DLC_Tests.yml
index faf8e586ba..a35c7bce2a 100644
--- a/.github/workflows/Linux_2.12_KeyManager_Wallet_DLC_Tests.yml
+++ b/.github/workflows/Linux_2.12_KeyManager_Wallet_DLC_Tests.yml
@@ -22,4 +22,4 @@ jobs:
             ~/.bitcoin-s/binaries
           key: ${{ runner.os }}-cache
       - name: run tests
-        run: sbt ++2.12.12 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls
+        run: sbt ++2.12.12 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls dlcTest/test dlcWalletTest/test
diff --git a/.github/workflows/Linux_2.13_KeyManager_Wallet_DLC_Tests.yml b/.github/workflows/Linux_2.13_KeyManager_Wallet_DLC_Tests.yml
index 22edac5359..11f5c27bf3 100644
--- a/.github/workflows/Linux_2.13_KeyManager_Wallet_DLC_Tests.yml
+++ b/.github/workflows/Linux_2.13_KeyManager_Wallet_DLC_Tests.yml
@@ -22,4 +22,4 @@ jobs:
             ~/.bitcoin-s/binaries
           key: ${{ runner.os }}-cache
       - name: run tests
-        run: sbt ++2.13.4 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls
+        run: sbt ++2.13.4 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls dlcTest/test dlcWalletTest/test
diff --git a/.github/workflows/Mac_2.13_Wallet_Node_DLC_Tests.yml b/.github/workflows/Mac_2.13_Wallet_Node_DLC_Tests.yml
index e2661ae350..f3e983d90b 100644
--- a/.github/workflows/Mac_2.13_Wallet_Node_DLC_Tests.yml
+++ b/.github/workflows/Mac_2.13_Wallet_Node_DLC_Tests.yml
@@ -22,4 +22,4 @@ jobs:
             ~/.bitcoin-s/binaries
           key: ${{ runner.os }}-cache
       - name: run tests
-        run: sbt ++2.13.4 downloadBitcoind coverage walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls nodeTest/test node/coverageReport node/coverageAggregate node/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coveralls
\ No newline at end of file
+        run: sbt ++2.13.4 downloadBitcoind coverage walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls nodeTest/test node/coverageReport node/coverageAggregate node/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coveralls dlcTest/test dlcWalletTest/test
\ No newline at end of file
diff --git a/app-commons-test/src/test/scala/org/bitcoins/commons/dlc/DLCMessageTest.scala b/app-commons-test/src/test/scala/org/bitcoins/commons/dlc/DLCMessageTest.scala
index e1d44607ec..9132b0fb09 100644
--- a/app-commons-test/src/test/scala/org/bitcoins/commons/dlc/DLCMessageTest.scala
+++ b/app-commons-test/src/test/scala/org/bitcoins/commons/dlc/DLCMessageTest.scala
@@ -65,4 +65,30 @@ class DLCMessageTest extends BitcoinSAsyncTest {
       )
     )
   }
+
+  it must "be able to go back and forth between TLV and deserialized" in {
+    forAll(TLVGen.dlcOfferTLVAcceptTLVSignTLV) {
+      case (offerTLV, acceptTLV, signTLV) =>
+        val offer = DLCOffer.fromTLV(offerTLV)
+        val accept = DLCAccept.fromTLV(acceptTLV, offer)
+        val sign = DLCSign.fromTLV(signTLV, offer)
+
+        assert(offer.toTLV == offerTLV)
+        assert(accept.toTLV == acceptTLV)
+        assert(sign.toTLV == signTLV)
+    }
+  }
+
+  it must "be able to go back and forth between LN Message and deserialized" in {
+    forAll(LnMessageGen.dlcOfferMessageAcceptMessageSignMessage) {
+      case (offerMsg, acceptMsg, signMsg) =>
+        val offer = DLCOffer.fromMessage(offerMsg)
+        val accept = DLCAccept.fromMessage(acceptMsg, offer)
+        val sign = DLCSign.fromMessage(signMsg, offer)
+
+        assert(offer.toMessage == offerMsg)
+        assert(accept.toMessage == acceptMsg)
+        assert(sign.toMessage == signMsg)
+    }
+  }
 }
diff --git a/app/dlc-suredbits-client-test/dlc-suredbits-client-test.sbt b/app/dlc-suredbits-client-test/dlc-suredbits-client-test.sbt
new file mode 100644
index 0000000000..0af45f1c39
--- /dev/null
+++ b/app/dlc-suredbits-client-test/dlc-suredbits-client-test.sbt
@@ -0,0 +1,3 @@
+name := "bitcoin-s-sbclient-test"
+
+publish / skip := true
diff --git a/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/MockServer.scala b/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/MockServer.scala
new file mode 100644
index 0000000000..336e6d7f37
--- /dev/null
+++ b/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/MockServer.scala
@@ -0,0 +1,133 @@
+package org.bitcoins.sbclient
+
+import akka.Done
+import akka.actor.ActorSystem
+import akka.http.scaladsl.Http
+import akka.http.scaladsl.model.{ContentTypes, HttpEntity}
+import akka.http.scaladsl.server.Directives._
+import akka.http.scaladsl.server.Route
+import org.bitcoins.core.protocol.ln.currency.{LnCurrencyUnit, MilliSatoshis}
+import org.bitcoins.core.protocol.ln.{LnInvoice, PaymentPreimage}
+import org.bitcoins.crypto._
+import org.bitcoins.rpc.util.RpcUtil
+import org.bitcoins.testkit.eclair.MockEclairClient
+import scodec.bits.ByteVector
+
+import scala.concurrent.{ExecutionContext, Future, Promise}
+import scala.util.matching.Regex
+
+class MockServer()(implicit ec: ExecutionContext) {
+  val mockEclair: MockEclairClient = new MockEclairClient()
+
+  def preImage(invoice: LnInvoice): PaymentPreimage = {
+    mockEclair.preImage(invoice.lnTags.paymentHash)
+  }
+
+  def encryptData(data: String, price: LnCurrencyUnit)(implicit
+      ec: ExecutionContext): Future[(LnInvoice, String)] = {
+    val invoiceF =
+      mockEclair.createInvoice(
+        description = s"Mock Invoice",
+        price.toMSat
+      )
+
+    invoiceF.map { invoice =>
+      val preimage = preImage(invoice)
+
+      val dataBytes: ByteVector = ByteVector.encodeUtf8(data) match {
+        case Left(err) =>
+          throw new RuntimeException(s"Could not encode data to UTF-8!", err)
+        case Right(bytes) => bytes
+      }
+
+      val key = AesKey.fromValidBytes(preimage.bytes)
+
+      val encrypted: AesEncryptedData = AesCrypt.encrypt(dataBytes, key)
+
+      (invoice, encrypted.toBase64)
+    }
+  }
+
+  val exchangeRegex: Regex =
+    RegexUtil.noCaseOrRegex(Exchange.all.map(_.toLongString).:+("bitmex"))
+  val tradingPairRegex: Regex = RegexUtil.noCaseOrRegex(TradingPair.all)
+
+  val requestTypeRegex: Regex =
+    RegexUtil.noCaseOrRegex(RequestType.all :+ "PublicKey")
+
+  def route: Route = {
+    path(exchangeRegex / tradingPairRegex / requestTypeRegex) {
+      case (exchangeStr, pairStr, requestTypeStr) =>
+        if (requestTypeStr.toLowerCase == "publickey") {
+          val hash = CryptoUtil.sha256(s"$exchangeStr|$pairStr|pubkey")
+          val pubKey = ECPrivateKey(hash.bytes).schnorrPublicKey
+
+          complete {
+            HttpEntity(ContentTypes.`text/plain(UTF-8)`, pubKey.hex)
+          }
+        } else {
+          val data = Vector(exchangeStr, pairStr, requestTypeStr).mkString("|")
+          val encryptedF =
+            encryptData(data, MilliSatoshis(10000).toLnCurrencyUnit)
+          val responseF = encryptedF.map {
+            case (invoice, encrypted) =>
+              InvoiceAndDataResponse(invoice, encrypted).toJsonString
+          }
+          complete {
+            responseF.map { response =>
+              HttpEntity(ContentTypes.`application/json`, response)
+            }
+          }
+        }
+    } ~ path("ping") {
+      get {
+        complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>pong</h1>"))
+      }
+    }
+  }
+
+  val port: Int = RpcUtil.randomPort
+
+  val endpoint: String = s"http://localhost:$port"
+
+  private val serverBindingP = Promise[Future[Http.ServerBinding]]()
+
+  private val serverBindingF: Future[Http.ServerBinding] =
+    serverBindingP.future.flatten
+
+  private val stoppedP = Promise[Future[Done]]()
+  private val stoppedF: Future[Done] = stoppedP.future.flatten
+
+  serverBindingF.map { binding =>
+    scala.sys.addShutdownHook {
+      if (!stoppedF.isCompleted) {
+        val _ = binding.unbind()
+      }
+    }
+  }
+
+  def start()(implicit system: ActorSystem): Future[Http.ServerBinding] = {
+    if (serverBindingP.isCompleted) {
+      Future.failed(new RuntimeException("Mock Server already started!"))
+    } else {
+      val bindingF = Http().bindAndHandle(handler = route,
+                                          interface = "localhost",
+                                          port = port)
+      val _ = serverBindingP.success(bindingF)
+      bindingF
+    }
+  }
+
+  def stop(): Future[Done] = {
+    if (stoppedP.isCompleted || !serverBindingP.isCompleted) {
+      Future.failed(new RuntimeException(
+        "Cannot stop server if it has not been started or has already been stopped"))
+    } else {
+      val resultF = serverBindingF.flatMap(_.unbind())
+
+      stoppedP.success(resultF)
+
+      resultF
+    }
+  }
+}
diff --git a/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/RegexUtil.scala b/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/RegexUtil.scala
new file mode 100644
index 0000000000..b7a5f47593
--- /dev/null
+++ b/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/RegexUtil.scala
@@ -0,0 +1,36 @@
+package org.bitcoins.sbclient
+
+import scala.util.matching.Regex
+
+object RegexUtil {
+
+  /** Given a finite collection of case objects or strings, generates a Regex
+    * that matches its elements, insensitive to case.
+    *
+    * Example:
+    * case object A
+    * case object BC
+    * case object DEF
+    *
+    * Util.noCaseOrRegex(Vector(A, BC, DEF)) == "(?i)(?:DEF|BC|A)".r
+    */
+  def noCaseOrRegex[T](all: Seq[T]): Regex = {
+    val orStr = all
+      .sortBy(_.toString.length)(Ordering.Int.reverse)
+      .foldLeft("") {
+        case (rx, t) =>
+          rx + t + "|"
+      }
+      .init
+
+    noCaseRegex(orStr)
+  }
+
+  /** Turns a String into a case insensitive Regex */
+  def noCaseRegex(str: String): Regex = {
+    s"""(?i)(?:$str)""".r
+  }
+
+  /** Matches any String of any length */
+  val anyString: Regex = ".*".r
+}
diff --git a/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/SbClientTest.scala b/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/SbClientTest.scala
new file mode 100644
index 0000000000..a6795d7165
--- /dev/null
+++ b/app/dlc-suredbits-client-test/src/test/scala/org/bitcoins/sbclient/SbClientTest.scala
@@ -0,0 +1,124 @@
+package org.bitcoins.sbclient
+
+import org.bitcoins.commons.jsonmodels.eclair.{
+  IncomingPaymentStatus,
+  OutgoingPaymentStatus
+}
+import org.bitcoins.crypto.{CryptoUtil, ECPrivateKey}
+import org.bitcoins.core.protocol.ln.currency.MilliSatoshis
+import org.bitcoins.testkit.eclair.MockEclairClient
+import org.bitcoins.testkit.util.BitcoinSAsyncTest
+import org.scalacheck.Gen
+import scodec.bits.ByteVector
+
+import scala.concurrent.Await
+import scala.concurrent.duration.DurationInt
+
+class SbClientTest extends BitcoinSAsyncTest {
+  behavior of "SbClient"
+
+  val str = "Never gonna give you up, never gonna let you down"
+  val amt: MilliSatoshis = MilliSatoshis(10000)
+  val server = new MockServer()
+  val client = new MockEclairClient()
+
+  override def beforeAll(): Unit = {
+    super.beforeAll()
+    client.otherClient = Some(server.mockEclair)
+    server.mockEclair.otherClient = Some(client)
+    val _ = Await.result(server.start(), 5.seconds)
+  }
+
+  override def afterAll(): Unit = {
+    Await.result(server.stop(), 5.seconds)
+    super.afterAll()
+  }
+
+  it should "successfully decrypt data from server" in {
+    server.encryptData(str, amt.toLnCurrencyUnit).map {
+      case (invoice, encrypted) =>
+        val preImage = server.preImage(invoice)
+        val decrypted = SbClient.decryptData(encrypted, preImage)
+        assert(decrypted == str)
+    }
+  }
+
+  it should "successfully make a payment" in {
+    for {
+      invoice <- server.mockEclair.createInvoice(str, amt)
+      preImage <- SbClient.makePayment(client, invoice)
+      serverNodeId <- server.mockEclair.nodeId()
+    } yield {
+      assert(server.preImage(invoice) == preImage)
+
+      val incoming =
+        server.mockEclair.incomingPayment(invoice.lnTags.paymentHash)
+      val outgoing = client.outgoingPayment(invoice.lnTags.paymentHash)
+
+      assert(incoming.paymentRequest == outgoing.paymentRequest.get)
+      assert(incoming.paymentPreimage == preImage)
+      assert(incoming.status.isInstanceOf[IncomingPaymentStatus.Received])
+      assert(outgoing.status.isInstanceOf[OutgoingPaymentStatus.Succeeded])
+      assert(
+        outgoing.status
+          .asInstanceOf[OutgoingPaymentStatus.Succeeded]
+          .paymentPreimage == preImage)
+      assert(outgoing.amount == amt)
+      assert(outgoing.recipientNodeId == serverNodeId)
+    }
+  }
+
+  def exchangeAndPairGen: Gen[(Exchange, TradingPair)] =
+    Gen.oneOf(Exchange.all).flatMap { exchange =>
+      Gen.oneOf(exchange.pairs).map { pair =>
+        (exchange, pair)
+      }
+    }
+
+  it should "successfully request and decrypt an R value" in {
+    forAllAsync(exchangeAndPairGen) {
+      case (exchange, pair) =>
+        SbClient
+          .requestAndPay(exchange,
+                         pair,
+                         RequestType.RValue,
+                         client,
+                         server.endpoint)
+          .map { decrypted =>
+            assert(
+              decrypted == s"${exchange.toLongString}|${pair.toLowerString}|rvalue")
+          }
+    }
+  }
+
+  it should "successfully request and decrypt the last signature" in {
+    forAllAsync(exchangeAndPairGen) {
+      case (exchange, pair) =>
+        SbClient
+          .requestAndPay(exchange,
+                         pair,
+                         RequestType.LastSig,
+                         client,
+                         server.endpoint)
+          .map { decrypted =>
+            assert(
+              decrypted == s"${exchange.toLongString}|${pair.toLowerString}|lastsig")
+          }
+    }
+  }
+
+  it should "successfully request and receive a public key" in {
+    forAllAsync(exchangeAndPairGen) {
+      case (exchange, pair) =>
+        SbClient
+          .getPublicKey(exchange, pair, server.endpoint)
+          .map { response =>
+            val hash = CryptoUtil.sha256(
+              s"${exchange.toLongString}|${pair.toLowerString}|pubkey")
+            val expected = ECPrivateKey(hash.bytes).schnorrPublicKey
+
+            assert(response == expected)
+          }
+    }
+  }
+}
diff --git a/app/dlc-suredbits-client/dlc-suredbits-client.sbt b/app/dlc-suredbits-client/dlc-suredbits-client.sbt
new file mode 100644
index 0000000000..a6865c6a56
--- /dev/null
+++ b/app/dlc-suredbits-client/dlc-suredbits-client.sbt
@@ -0,0 +1,3 @@
+name := "bitcoin-s-dlc-suredbits-client"
+
+libraryDependencies ++= Deps.dlcSuredbitsClient
diff --git a/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/Asset.scala b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/Asset.scala
new file mode 100644
index 0000000000..74c0a3616c
--- /dev/null
+++ b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/Asset.scala
@@ -0,0 +1,44 @@
+package org.bitcoins.sbclient
+
+sealed abstract class Asset {
+  def toLowerString: String = this.toString.toLowerCase
+  def toUpperString: String = this.toString.toUpperCase
+}
+
+object Asset {
+  case object BTC extends Asset
+  case object ETH extends Asset
+  case object USD extends Asset
+  case object USDT extends Asset
+  case object LTC extends Asset
+  case object BCH extends Asset
+  case object XRP extends Asset
+  case object EOS extends Asset
+  case object EUR extends Asset
+
+  case object DOGE extends Asset
+  case object STR extends Asset
+
+  case class OtherAsset(name: String) extends Asset {
+    override def toString: String = name
+  }
+
+  def fromLowerString(str: String): Asset = {
+    val name = if (str.toLowerCase == "xbt") "btc" else str
+    val assetOpt = all.find(asset => asset.toLowerString == name)
+    assetOpt.getOrElse(OtherAsset(name.toUpperCase))
+  }
+
+  def fromUpperString(str: String): Asset = {
+    val name = if (str.toUpperCase == "XBT") "BTC" else str
+    val assetOpt = all.find(asset => asset.toUpperString == name)
+    assetOpt.getOrElse(OtherAsset(name))
+  }
+
+  def fromString(str: String): Asset = {
+    fromUpperString(str.toUpperCase)
+  }
+
+  def all: Vector[Asset] =
+    Vector(BTC, ETH, USD, USDT, LTC, BCH, XRP, EOS, EUR, DOGE, STR)
+}
diff --git a/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/Exchange.scala b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/Exchange.scala
new file mode 100644
index 0000000000..c3b3d5c628
--- /dev/null
+++ b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/Exchange.scala
@@ -0,0 +1,129 @@
+package org.bitcoins.sbclient
+
+sealed trait Exchange {
+
+  def pairs: Vector[TradingPair]
+
+  /**
+    * The unique string representation of of this exchange.
+    * Used to differentiate between spot and futures exchanges,
+    * e.g. Kraken vs KrakenFut etc
+    */
+  def toLongString: String
+
+  /** The unique string representation of this exchange where
+    * bitmex is not bitmexfut.
+    */
+  def toGeneralString: String = {
+    if (this == Exchange.Bitmex) {
+      "bitmex"
+    } else {
+      this.toLongString
+    }
+  }
+}
+
+sealed trait SpotExchange extends Exchange
+
+sealed trait FuturesExchange extends Exchange
+
+object Exchange {
+
+  /** Spot exchanges located in US, this is useful for log filtering */
+  val allUSSpot: Vector[SpotExchange] = Vector(Coinbase, Gemini, Kraken)
+
+  /** International spot exchanges, this is useful for log filtering */
+  val allInternationalSpot: Vector[SpotExchange] =
+    Vector(Bitfinex, Binance, Bitstamp)
+
+  val allSpot: Vector[SpotExchange] =
+    allUSSpot ++ allInternationalSpot
+
+  val allFut: Vector[FuturesExchange] = Vector(KrakenFut, Bitmex)
+
+  val all: Vector[Exchange] = allSpot ++ allFut
+
+  // Bitmex is special because we want to accept both bitmexfut and bitmex
+  val acceptedHistoricalNames: Vector[String] =
+    all.map(_.toLongString).:+("bitmex")
+
+  case object Bitfinex extends SpotExchange {
+    override def toString: String = "bitfinex"
+    override def toLongString: String = "bitfinex"
+    override def pairs: Vector[TradingPair] = BitfinexTradingPair.all
+  }
+
+  case object Binance extends SpotExchange {
+    override def toString: String = "binance"
+    override def toLongString: String = "binance"
+    override def pairs: Vector[TradingPair] = BinanceTradingPair.all
+  }
+
+  case object Coinbase extends SpotExchange {
+    override def toString: String = "coinbase"
+    override def toLongString: String = "coinbase"
+    override def pairs: Vector[TradingPair] = CoinbaseTradingPair.all
+  }
+
+  case object Bitstamp extends SpotExchange {
+    override def toString: String = "bitstamp"
+    override def toLongString: String = "bitstamp"
+    override def pairs: Vector[TradingPair] = BitstampTradingPair.all
+  }
+
+  case object Bitmex extends FuturesExchange {
+    override def toString: String = "bitmex"
+    override def toLongString: String = "bitmexfut"
+    override def pairs: Vector[TradingPair] = BitmexTradingPair.all
+  }
+
+  case object Gemini extends SpotExchange {
+    override def toString: String = "gemini"
+    override def toLongString: String = "gemini"
+    override def pairs: Vector[TradingPair] = GeminiTradingPair.all
+  }
+
+  case object Kraken extends SpotExchange {
+    override def toString: String = "kraken"
+    override def toLongString: String = "kraken"
+    override def pairs: Vector[TradingPair] = KrakenTradingPair.all
+  }
+
+  case object KrakenFut extends FuturesExchange {
+    override def toString: String = "kraken"
+    override def toLongString: String = "krakenfut"
+    override def pairs: Vector[TradingPair] = KrakenFutTradingPair.all
+  }
+}
+
+object SpotExchange {
+
+  def fromString(exchange: String): Option[SpotExchange] = {
+    exchange.toLowerCase match {
+      case "bitfinex" => Some(Exchange.Bitfinex)
+      case "binance"  => Some(Exchange.Binance)
+      case "coinbase" => Some(Exchange.Coinbase)
+      case "bitstamp" => Some(Exchange.Bitstamp)
+      case "gemini"   => Some(Exchange.Gemini)
+      case "kraken"   => Some(Exchange.Kraken)
+      case _: String  => None
+    }
+  }
+
+  override def toString: String = "spotexchange"
+}
+
+object FuturesExchange {
+
+  def fromString(exchange: String): Option[FuturesExchange] = {
+    exchange.toLowerCase match {
+      case "bitmex"    => Some(Exchange.Bitmex)
+      case "bitmexfut" => Some(Exchange.Bitmex)
+      case "kraken"    => Some(Exchange.KrakenFut)
+      case "krakenfut" => Some(Exchange.KrakenFut)
+      case _: String   => None
+    }
+  }
+
+  override def toString: String = "futuresexchange"
+}
diff --git a/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/InvoiceAndDataResponse.scala b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/InvoiceAndDataResponse.scala
new file mode 100644
index 0000000000..d0a99a1528
--- /dev/null
+++ b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/InvoiceAndDataResponse.scala
@@ -0,0 +1,10 @@
+package org.bitcoins.sbclient
+
+import org.bitcoins.core.protocol.ln.LnInvoice
+
+case class InvoiceAndDataResponse(invoice: LnInvoice, encryptedData: String) {
+
+  def toJsonString: String = {
+    s"""{"invoice":"${invoice.toString}", "encryptedData":"$encryptedData"}"""
+  }
+}
diff --git a/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/RequestType.scala b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/RequestType.scala
new file mode 100644
index 0000000000..061320220a
--- /dev/null
+++ b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/RequestType.scala
@@ -0,0 +1,18 @@
+package org.bitcoins.sbclient
+
+sealed trait RequestType {
+  def requestString: String
+}
+
+object RequestType {
+
+  case object RValue extends RequestType {
+    override def requestString: String = "rvalue"
+  }
+
+  case object LastSig extends RequestType {
+    override def requestString: String = "lastsig"
+  }
+
+  val all: Vector[RequestType] = Vector(RValue, LastSig)
+}
diff --git a/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/SbClient.scala b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/SbClient.scala
new file mode 100644
index 0000000000..9f02b6a04c
--- /dev/null
+++ b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/SbClient.scala
@@ -0,0 +1,149 @@
+package org.bitcoins.sbclient
+
+import akka.actor.ActorSystem
+import akka.http.scaladsl.Http
+import akka.http.scaladsl.model.{HttpRequest, Uri}
+import akka.stream.Materializer
+import akka.util.ByteString
+import org.bitcoins.commons.jsonmodels.eclair.OutgoingPaymentStatus
+import org.bitcoins.crypto.{
+  AesCrypt,
+  AesEncryptedData,
+  AesKey,
+  ECPublicKey,
+  SchnorrDigitalSignature,
+  SchnorrPublicKey
+}
+import org.bitcoins.core.protocol.ln.{LnInvoice, PaymentPreimage}
+import org.bitcoins.eclair.rpc.api.EclairApi
+import play.api.libs.json.{JsError, JsSuccess, JsValue, Json, Reads}
+
+import scala.concurrent.{ExecutionContext, ExecutionContextExecutor, Future}
+import scala.concurrent.duration.{DurationInt, FiniteDuration}
+
+object SbClient {
+
+  def rawRestCall(uri: Uri)(implicit system: ActorSystem): Future[String] = {
+    implicit val m: Materializer = Materializer.createMaterializer(system)
+    implicit val ec: ExecutionContextExecutor = m.executionContext
+
+    Http()
+      .singleRequest(HttpRequest(uri = uri))
+      .flatMap(response =>
+        response.entity.dataBytes
+          .runFold(ByteString.empty)(_ ++ _)
+          .map(payload => payload.decodeString(ByteString.UTF_8)))
+  }
+
+  def getPublicKey(
+      exchange: Exchange,
+      pair: TradingPair,
+      endpoint: String = "https://test.api.suredbits.com/dlc/v0")(implicit
+      system: ActorSystem): Future[SchnorrPublicKey] = {
+    val uri =
+      s"$endpoint/${exchange.toLongString}/${pair.toLowerString}/PublicKey"
+
+    import system.dispatcher
+
+    rawRestCall(uri).map(SchnorrPublicKey.fromHex)
+  }
+
+  def restCall(uri: Uri)(implicit system: ActorSystem): Future[JsValue] = {
+    rawRestCall(uri).map(Json.parse)(system.dispatcher)
+  }
+
+  import org.bitcoins.commons.serializers.JsonReaders.lnInvoiceReads
+
+  implicit val invoiceAndDataResponseReads: Reads[InvoiceAndDataResponse] =
+    Json.reads[InvoiceAndDataResponse]
+
+  def request(
+      exchange: Exchange,
+      tradingPair: TradingPair,
+      requestType: RequestType,
+      endpoint: String = "https://test.api.suredbits.com/dlc/v0")(implicit
+      system: ActorSystem): Future[InvoiceAndDataResponse] = {
+    implicit val ec: ExecutionContextExecutor = system.dispatcher
+
+    val uri =
+      s"$endpoint/${exchange.toLongString}/${tradingPair.toLowerString}/${requestType.requestString}"
+    restCall(uri)
+      .map(_.validate[InvoiceAndDataResponse])
+      .flatMap {
+        case JsSuccess(response, _) => Future.successful(response)
+        case JsError(error) =>
+          Future.failed(
+            new RuntimeException(
+              s"Unexpected error when parsing response: $error"))
+      }
+  }
+
+  def makePayment(
+      eclairApi: EclairApi,
+      invoice: LnInvoice,
+      timeout: FiniteDuration = 5.seconds)(implicit
+      ec: ExecutionContext): Future[PaymentPreimage] = {
+    for {
+      payment <- eclairApi.payAndMonitorInvoice(invoice,
+                                                externalId = None,
+                                                interval = timeout / 10,
+                                                maxAttempts = 10)
+    } yield payment.status match {
+      case OutgoingPaymentStatus.Succeeded(preImage, _, _, _) => preImage
+      case OutgoingPaymentStatus.Failed(errs) =>
+        val errMsgs = errs.map(_.failureMessage).mkString(",\n")
+        throw new RuntimeException(s"Payment failed: $errMsgs")
+      case OutgoingPaymentStatus.Pending =>
+        throw new IllegalStateException(
+          "This should not be possible because invoice monitoring should only return on Succeeded or Failed.")
+    }
+  }
+
+  def decryptData(data: String, preImage: PaymentPreimage): String = {
+    AesCrypt.decrypt(AesEncryptedData.fromValidBase64(data),
+                     AesKey.fromValidBytes(preImage.bytes)) match {
+      case Left(err) => throw err
+      case Right(decrypted) =>
+        decrypted.decodeUtf8 match {
+          case Right(decodedStr) => decodedStr
+          case Left(err)         => throw err
+        }
+    }
+  }
+
+  def requestAndPay(
+      exchange: Exchange,
+      tradingPair: TradingPair,
+      requestType: RequestType,
+      eclairApi: EclairApi,
+      endpoint: String = "https://test.api.suredbits.com/dlc/v0")(implicit
+      system: ActorSystem): Future[String] = {
+    implicit val ec: ExecutionContextExecutor = system.dispatcher
+
+    for {
+      InvoiceAndDataResponse(invoice, encryptedData) <-
+        request(exchange, tradingPair, requestType, endpoint)
+      preImage <- makePayment(eclairApi, invoice)
+    } yield decryptData(encryptedData, preImage)
+  }
+
+  def requestRValueAndPay(
+      exchange: Exchange,
+      tradingPair: TradingPair,
+      eclairApi: EclairApi)(implicit
+      system: ActorSystem): Future[ECPublicKey] = {
+    val dataF =
+      requestAndPay(exchange, tradingPair, RequestType.RValue, eclairApi)
+    dataF.map(ECPublicKey.fromHex)(system.dispatcher)
+  }
+
+  def requestLastSigAndPay(
+      exchange: Exchange,
+      tradingPair: TradingPair,
+      eclairApi: EclairApi)(implicit
+      system: ActorSystem): Future[SchnorrDigitalSignature] = {
+    val dataF =
+      requestAndPay(exchange, tradingPair, RequestType.LastSig, eclairApi)
+    dataF.map(SchnorrDigitalSignature.fromHex)(system.dispatcher)
+  }
+}
diff --git a/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/TradingPair.scala b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/TradingPair.scala
new file mode 100644
index 0000000000..5ed27e9010
--- /dev/null
+++ b/app/dlc-suredbits-client/src/main/scala/org/bitcoins/sbclient/TradingPair.scala
@@ -0,0 +1,538 @@
+package org.bitcoins.sbclient
+
+import org.bitcoins.sbclient.Asset._
+import org.bitcoins.sbclient.TradingPair.UnsupportedTradingPair
+
+sealed abstract class TradingPair(left: Asset, right: Asset)
+    extends Serializable {
+  def toLowerString: String = this.toString.toLowerCase
+  def toUpperString: String = this.toString.toUpperCase
+  def getLeft: Asset = left
+  def getRight: Asset = right
+
+  def isSupportedBy(exchange: Exchange): Boolean = {
+    exchange match {
+      case Exchange.Bitfinex  => this.isInstanceOf[BitfinexTradingPair]
+      case Exchange.Binance   => this.isInstanceOf[BinanceTradingPair]
+      case Exchange.Coinbase  => this.isInstanceOf[CoinbaseTradingPair]
+      case Exchange.Bitstamp  => this.isInstanceOf[BitstampTradingPair]
+      case Exchange.Gemini    => this.isInstanceOf[GeminiTradingPair]
+      case Exchange.Kraken    => this.isInstanceOf[KrakenTradingPair]
+      case Exchange.KrakenFut => this.isInstanceOf[KrakenFutTradingPair]
+      case Exchange.Bitmex    => this.isInstanceOf[BitmexTradingPair]
+    }
+  }
+}
+
+sealed trait BitfinexTradingPair extends TradingPair
+sealed trait BinanceTradingPair extends TradingPair
+sealed trait CoinbaseTradingPair extends TradingPair
+sealed trait BitstampTradingPair extends TradingPair
+sealed trait GeminiTradingPair extends TradingPair
+sealed trait KrakenTradingPair extends TradingPair
+sealed trait KrakenFutTradingPair extends TradingPair
+sealed trait BitmexTradingPair extends TradingPair
+
+object TradingPair {
+
+  private val aliases = Vector("XBT", "XDG", "XLM", "BCHABC", "BAB")
+
+  private def mapAlias(alias: String): String = {
+    alias match {
+      case "XBT"            => "BTC"
+      case "XDG"            => "DOGE"
+      case "XLM"            => "STR"
+      case "BCHABC" | "BAB" => "BCH"
+      case notAlias: String => notAlias
+    }
+  }
+
+  private def handleAliasOfSize(size: Int, pair: String): String = {
+    val safeToCheck = pair.length >= size
+    lazy val leftIsAlias = aliases.contains(pair.take(size).toUpperCase)
+    lazy val rightIsAlias = aliases.contains(pair.takeRight(size).toUpperCase)
+
+    if (safeToCheck && leftIsAlias) {
+      mapAlias(pair.take(size).toUpperCase) + pair.drop(size)
+    } else if (safeToCheck && rightIsAlias) {
+      pair.dropRight(size) + mapAlias(pair.takeRight(size).toUpperCase)
+    } else {
+      pair
+    }
+  }
+
+  private def handleAlias(pair: String): String = {
+    val handled3 = handleAliasOfSize(size = 3, pair = pair)
+
+    handleAliasOfSize(size = 6, pair = handled3)
+  }
+
+  /** Reads a [[TradingPair trading pair]] from a string
+    * returns None if it DNE
+    */
+  def fromStringOpt(pair: String): Option[TradingPair] = {
+    val translatedPair = handleAlias(pair)
+
+    val pairOpt =
+      all.find(tradingPair =>
+        tradingPair.toUpperString == translatedPair.toUpperCase)
+
+    pairOpt
+  }
+
+  /** Reads a [[TradingPair trading pair]] from a string
+    * returns a [[UnsupportedTradingPair unsupported traiding pair]]
+    * that contains the given string if it does not exist.
+    */
+  def fromString(pair: String): TradingPair = {
+    val translatedPair = handleAlias(pair)
+    val pairOpt = fromStringOpt(pair)
+    lazy val unsupported =
+      UnsupportedTradingPair.fromString(translatedPair)
+    pairOpt.getOrElse(unsupported)
+  }
+
+  case object BTCUSD
+      extends TradingPair(BTC, USD)
+      with BitfinexTradingPair
+      with CoinbaseTradingPair
+      with BitstampTradingPair
+      with GeminiTradingPair
+      with KrakenTradingPair
+      with KrakenFutTradingPair
+      with BitmexTradingPair
+
+  case object ETHUSD
+      extends TradingPair(ETH, USD)
+      with BitfinexTradingPair
+      with CoinbaseTradingPair
+      with BitstampTradingPair
+      with GeminiTradingPair
+      with KrakenTradingPair
+      with KrakenFutTradingPair
+      with BitmexTradingPair
+
+  case object ETHBTC
+      extends TradingPair(ETH, BTC)
+      with BitfinexTradingPair
+      with BinanceTradingPair
+      with CoinbaseTradingPair
+      with BitstampTradingPair
+      with GeminiTradingPair
+      with KrakenTradingPair
+      with BitmexTradingPair
+
+  case object LTCUSD
+      extends TradingPair(LTC, USD)
+      with BitfinexTradingPair
+      with CoinbaseTradingPair
+      with BitstampTradingPair
+      with GeminiTradingPair
+      with KrakenTradingPair
+      with KrakenFutTradingPair
+
+  case object LTCBTC
+      extends TradingPair(LTC, BTC)
+      with BitfinexTradingPair
+      with BinanceTradingPair
+      with CoinbaseTradingPair
+      with BitstampTradingPair
+      with GeminiTradingPair
+      with KrakenTradingPair
+      with BitmexTradingPair
+
+  case object LTCETH
+      extends TradingPair(LTC, ETH)
+      with BinanceTradingPair
+      with GeminiTradingPair
+
+  case object BCHUSD
+      extends TradingPair(BCH, USD)
+      with BitfinexTradingPair
+      with CoinbaseTradingPair
+      with BitstampTradingPair
+      with GeminiTradingPair
+      with KrakenTradingPair
+      with KrakenFutTradingPair
+
+  case object BCHBTC
+      extends TradingPair(BCH, BTC)
+      with BitfinexTradingPair
+      with BinanceTradingPair
+      with CoinbaseTradingPair
+      with BitstampTradingPair
+      with GeminiTradingPair
+      with KrakenTradingPair
+      with BitmexTradingPair
+
+  case object BCHETH extends TradingPair(BCH, ETH) with GeminiTradingPair
+
+  case object LTCBCH extends TradingPair(LTC, BCH) with GeminiTradingPair
+
+  case object XRPUSD
+      extends TradingPair(XRP, USD)
+      with BitfinexTradingPair
+      with BitstampTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+      with KrakenFutTradingPair
+
+  case object XRPBTC
+      extends TradingPair(XRP, BTC)
+      with BinanceTradingPair
+      with BitfinexTradingPair
+      with BitstampTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+      with BitmexTradingPair
+      with KrakenFutTradingPair
+
+  case object XRPETH extends TradingPair(XRP, ETH) with BinanceTradingPair
+
+  case object EOSUSD
+      extends TradingPair(EOS, USD)
+      with BitfinexTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+
+  case object EOSBTC
+      extends TradingPair(EOS, BTC)
+      with BitfinexTradingPair
+      with BinanceTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+      with BitmexTradingPair
+
+  case object EOSETH
+      extends TradingPair(EOS, ETH)
+      with BitfinexTradingPair
+      with BinanceTradingPair
+      with KrakenTradingPair
+
+  case object BTCUSDT extends TradingPair(BTC, USDT) with BinanceTradingPair
+
+  case object ETHUSDT extends TradingPair(ETH, USDT) with BinanceTradingPair
+
+  case object LTCUSDT extends TradingPair(LTC, USDT) with BinanceTradingPair
+
+  case object BCHUSDT extends TradingPair(BCH, USDT) with BinanceTradingPair
+
+  case object XRPUSDT extends TradingPair(XRP, USDT) with BinanceTradingPair
+
+  case object EOSUSDT extends TradingPair(EOS, USDT) with BinanceTradingPair
+
+  case object EURUSD extends TradingPair(EUR, USD) with BitstampTradingPair
+
+  case object BTCEUR
+      extends TradingPair(BTC, EUR)
+      with BitfinexTradingPair
+      with BitstampTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+
+  case object ETHEUR
+      extends TradingPair(ETH, EUR)
+      with BitfinexTradingPair
+      with BitstampTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+
+  case object LTCEUR
+      extends TradingPair(LTC, EUR)
+      with BitstampTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+
+  case object BCHEUR
+      extends TradingPair(BCH, EUR)
+      with BitstampTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+
+  case object XRPEUR
+      extends TradingPair(XRP, EUR)
+      with BitstampTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+
+  case object EOSEUR
+      extends TradingPair(EOS, EUR)
+      with BitfinexTradingPair
+      with CoinbaseTradingPair
+      with KrakenTradingPair
+
+  case class UnsupportedTradingPair(left: Asset, right: Asset)
+      extends TradingPair(left, right)
+      with BitfinexTradingPair
+      with BinanceTradingPair
+      with CoinbaseTradingPair
+      with BitstampTradingPair
+      with GeminiTradingPair
+      with KrakenTradingPair
+      with KrakenFutTradingPair
+      with BitmexTradingPair {
+
+    override def toLowerString: String = {
+      s"$left$right".toLowerCase
+    }
+
+    override def toUpperString: String = {
+      s"$left$right".toUpperCase
+    }
+  }
+
+  object UnsupportedTradingPair {
+
+    def fromString(pair: String): UnsupportedTradingPair = {
+      val lowerPair = pair.toLowerCase
+      val cut = Math.min(3, pair.length)
+
+      UnsupportedTradingPair(
+        Asset.fromLowerString(lowerPair.substring(0, cut)),
+        Asset.fromLowerString(lowerPair.substring(cut))
+      )
+    }
+  }
+
+  val all: Vector[TradingPair] =
+    Vector(
+      BTCUSD,
+      ETHUSD,
+      ETHBTC,
+      BTCUSDT,
+      ETHUSDT,
+      LTCUSD,
+      LTCBTC,
+      LTCETH,
+      LTCUSDT,
+      BCHUSD,
+      BCHBTC,
+      BCHETH,
+      LTCBCH,
+      BCHUSDT,
+      XRPUSD,
+      XRPBTC,
+      XRPETH,
+      XRPUSDT,
+      EOSUSD,
+      EOSBTC,
+      EOSETH,
+      EOSUSDT,
+      EURUSD,
+      BTCEUR,
+      ETHEUR,
+      BCHEUR,
+      LTCEUR,
+      XRPEUR,
+      EOSEUR
+    )
+
+  def allForExchange(exchange: Exchange): Vector[TradingPair] = {
+    exchange match {
+      case Exchange.Binance   => BinanceTradingPair.all
+      case Exchange.Bitfinex  => BitfinexTradingPair.all
+      case Exchange.Bitstamp  => BitstampTradingPair.all
+      case Exchange.Coinbase  => CoinbaseTradingPair.all
+      case Exchange.Gemini    => GeminiTradingPair.all
+      case Exchange.Kraken    => KrakenTradingPair.all
+      case Exchange.Bitmex    => BitmexTradingPair.all
+      case Exchange.KrakenFut => KrakenFutTradingPair.all
+    }
+  }
+}
+
+/** This trait is to avoid a bunch of copying code in MyExchangeTradingPair companion object */
+trait TradingPairObject[PairType >: UnsupportedTradingPair <: TradingPair] {
+  def all: Vector[PairType]
+
+  def fromString(pair: String): PairType = {
+    val tradingPair: TradingPair = TradingPair.fromString(pair)
+    fromTradingPair(tradingPair)
+  }
+
+  def fromTradingPair(pair: TradingPair): PairType = {
+    all
+      .find(_ == pair)
+      .getOrElse(UnsupportedTradingPair(pair.getLeft, pair.getRight))
+  }
+}
+
+object BitfinexTradingPair extends TradingPairObject[BitfinexTradingPair] {
+
+  def all: Vector[BitfinexTradingPair] =
+    Vector(
+      TradingPair.BTCUSD,
+      TradingPair.ETHUSD,
+      TradingPair.ETHBTC,
+      TradingPair.LTCUSD,
+      TradingPair.LTCBTC,
+      TradingPair.BCHUSD,
+      TradingPair.BCHBTC,
+      TradingPair.XRPUSD,
+      TradingPair.XRPBTC,
+      TradingPair.EOSUSD,
+      TradingPair.EOSBTC,
+      TradingPair.EOSETH,
+      TradingPair.BTCEUR,
+      TradingPair.ETHEUR,
+      TradingPair.EOSEUR
+    )
+}
+
+object BinanceTradingPair extends TradingPairObject[BinanceTradingPair] {
+
+  def all: Vector[BinanceTradingPair] =
+    Vector(
+      TradingPair.BTCUSDT,
+      TradingPair.ETHUSDT,
+      TradingPair.ETHBTC,
+      TradingPair.LTCUSDT,
+      TradingPair.LTCBTC,
+      TradingPair.LTCETH,
+      TradingPair.BCHUSDT,
+      TradingPair.BCHBTC,
+      TradingPair.XRPUSDT,
+      TradingPair.XRPBTC,
+      TradingPair.XRPETH,
+      TradingPair.EOSUSDT,
+      TradingPair.EOSBTC,
+      TradingPair.EOSETH
+    )
+}
+
+object CoinbaseTradingPair extends TradingPairObject[CoinbaseTradingPair] {
+
+  def fromCoinbaseString(pair: String): CoinbaseTradingPair = {
+    val noHyphenPair = pair.filter(_ != '-')
+    CoinbaseTradingPair.fromString(noHyphenPair)
+  }
+
+  def all: Vector[CoinbaseTradingPair] =
+    Vector(
+      TradingPair.BTCUSD,
+      TradingPair.ETHUSD,
+      TradingPair.ETHBTC,
+      TradingPair.LTCUSD,
+      TradingPair.LTCBTC,
+      TradingPair.BCHUSD,
+      TradingPair.BCHBTC,
+      TradingPair.XRPUSD,
+      TradingPair.XRPBTC,
+      TradingPair.EOSUSD,
+      TradingPair.EOSBTC,
+      TradingPair.BTCEUR,
+      TradingPair.ETHEUR,
+      TradingPair.LTCEUR,
+      TradingPair.BCHEUR,
+      TradingPair.XRPEUR,
+      TradingPair.EOSEUR
+    )
+}
+
+object BitstampTradingPair extends TradingPairObject[BitstampTradingPair] {
+
+  def fromBitstampChannelName(channel: String): BitstampTradingPair = {
+    val pieces = channel.split("_")
+
+    // Bitstamp omits a currency pair for btcusd
+    // (e.g. live_trades = live_trades_btcusd)
+    if (pieces.length == 2) {
+      TradingPair.BTCUSD
+    } else {
+      fromString(pieces.last)
+    }
+  }
+
+  def all: Vector[BitstampTradingPair] =
+    Vector(
+      TradingPair.BTCUSD,
+      TradingPair.ETHUSD,
+      TradingPair.ETHBTC,
+      TradingPair.LTCUSD,
+      TradingPair.LTCBTC,
+      TradingPair.BCHUSD,
+      TradingPair.BCHBTC,
+      TradingPair.XRPUSD,
+      TradingPair.XRPBTC,
+      TradingPair.EURUSD,
+      TradingPair.BTCEUR,
+      TradingPair.ETHEUR,
+      TradingPair.LTCEUR,
+      TradingPair.BCHEUR,
+      TradingPair.XRPEUR
+    )
+}
+
+object GeminiTradingPair extends TradingPairObject[GeminiTradingPair] {
+
+  def all: Vector[GeminiTradingPair] =
+    Vector(
+      TradingPair.BTCUSD,
+      TradingPair.ETHUSD,
+      TradingPair.ETHBTC,
+      TradingPair.LTCUSD,
+      TradingPair.LTCBTC,
+      TradingPair.LTCETH,
+      TradingPair.BCHUSD,
+      TradingPair.BCHBTC,
+      TradingPair.BCHETH,
+      TradingPair.LTCBCH
+    )
+}
+
+object KrakenTradingPair extends TradingPairObject[KrakenTradingPair] {
+
+  def fromKrakenString(pair: String): KrakenTradingPair = {
+    val pairNoSeparators = pair.filter(_ != '/')
+    KrakenTradingPair.fromString(pairNoSeparators)
+  }
+
+  def all: Vector[KrakenTradingPair] =
+    Vector(
+      TradingPair.BTCUSD,
+      TradingPair.ETHUSD,
+      TradingPair.ETHBTC,
+      TradingPair.LTCUSD,
+      TradingPair.LTCBTC,
+      TradingPair.BCHUSD,
+      TradingPair.BCHBTC,
+      TradingPair.XRPUSD,
+      TradingPair.XRPBTC,
+      TradingPair.EOSUSD,
+      TradingPair.EOSBTC,
+      TradingPair.EOSETH,
+      TradingPair.BTCEUR,
+      TradingPair.ETHEUR,
+      TradingPair.LTCEUR,
+      TradingPair.BCHEUR,
+      TradingPair.XRPEUR,
+      TradingPair.EOSEUR
+    )
+}
+
+object KrakenFutTradingPair extends TradingPairObject[KrakenFutTradingPair] {
+
+  def all: Vector[KrakenFutTradingPair] =
+    Vector(
+      TradingPair.BTCUSD,
+      TradingPair.ETHUSD,
+      TradingPair.LTCUSD,
+      TradingPair.BCHUSD,
+      TradingPair.XRPUSD,
+      TradingPair.XRPBTC
+    )
+}
+
+object BitmexTradingPair extends TradingPairObject[BitmexTradingPair] {
+
+  def all: Vector[BitmexTradingPair] =
+    Vector(
+      TradingPair.BTCUSD,
+      TradingPair.ETHUSD,
+      TradingPair.ETHBTC,
+      TradingPair.LTCBTC,
+      TradingPair.BCHBTC,
+      TradingPair.XRPBTC,
+      TradingPair.EOSBTC
+    )
+}
diff --git a/app/gui/src/main/scala/org/bitcoins/gui/GlobalData.scala b/app/gui/src/main/scala/org/bitcoins/gui/GlobalData.scala
index 10de687eed..57830dc058 100644
--- a/app/gui/src/main/scala/org/bitcoins/gui/GlobalData.scala
+++ b/app/gui/src/main/scala/org/bitcoins/gui/GlobalData.scala
@@ -1,7 +1,8 @@
 package org.bitcoins.gui
 
 import org.bitcoins.cli.Config
-import org.bitcoins.core.config.BitcoinNetwork
+import org.bitcoins.core.config._
+import org.bitcoins.crypto.DoubleSha256DigestBE
 import org.bitcoins.gui.settings.Themes
 import scalafx.beans.property.{DoubleProperty, StringProperty}
 
@@ -34,4 +35,24 @@ object GlobalData {
       case Some(rpcPort) =>
         Config(debug = debug, rpcPort = rpcPort)
     }
+
+  lazy val broadcastUrl: String = GlobalData.network match {
+    case MainNet =>
+      "https://blockstream.info/api/tx"
+    case TestNet3 =>
+      "https://blockstream.info/testnet/api/tx"
+    case net @ (RegTest | SigNet) => s"Broadcast from your own node on $net"
+  }
+
+  /** Builds a url for the blockstream explorer to view the tx */
+  def buildTxUrl(txid: DoubleSha256DigestBE): String = {
+    network match {
+      case MainNet =>
+        s"https://blockstream.info/tx/${txid.hex}"
+      case TestNet3 =>
+        s"https://blockstream.info/testnet/tx/${txid.hex}"
+      case net @ (RegTest | SigNet) =>
+        s"View transaction on your own node on $net"
+    }
+  }
 }
diff --git a/app/gui/src/main/scala/org/bitcoins/gui/dlc/DLCPaneModel.scala b/app/gui/src/main/scala/org/bitcoins/gui/dlc/DLCPaneModel.scala
index 4cc6c1ea55..11138e570a 100644
--- a/app/gui/src/main/scala/org/bitcoins/gui/dlc/DLCPaneModel.scala
+++ b/app/gui/src/main/scala/org/bitcoins/gui/dlc/DLCPaneModel.scala
@@ -7,6 +7,7 @@ import org.bitcoins.commons.jsonmodels.dlc.DLCStatus
 import org.bitcoins.core.config.MainNet
 import org.bitcoins.core.number.{Int32, UInt16, UInt32}
 import org.bitcoins.core.protocol.tlv._
+import org.bitcoins.core.protocol.transaction.Transaction
 import org.bitcoins.crypto.{CryptoUtil, ECPrivateKey, Sha256DigestBE}
 import org.bitcoins.gui.dlc.dialog._
 import org.bitcoins.gui.{GlobalData, TaskRunner}
@@ -15,11 +16,32 @@ import scalafx.collections.ObservableBuffer
 import scalafx.scene.control.TextArea
 import scalafx.stage.Window
 
-import scala.util.{Failure, Success}
+import scala.util.{Failure, Success, Try}
 
 class DLCPaneModel(resultArea: TextArea, oracleInfoArea: TextArea) {
   var taskRunner: TaskRunner = _
 
+  lazy val txPrintFunc: String => String = str => {
+    // See if it was an error or not
+    Try(Transaction.fromHex(str)) match {
+      case Failure(_) =>
+        // if it was print the error
+        str
+      case Success(tx) =>
+        s"""|TxId: ${tx.txIdBE.hex}
+            |
+            |url: ${GlobalData.buildTxUrl(tx.txIdBE)}
+            |
+            |If the tx doesn't show up after a few minutes at this url you may need to manually
+            |broadcast the tx with the full hex below
+            |
+            |Link to broadcast: ${GlobalData.broadcastUrl}
+            |
+            |Transaction: ${tx.hex}
+      """.stripMargin
+    }
+  }
+
   // Sadly, it is a Java "pattern" to pass null into
   // constructors to signal that you want some default
   val parentWindow: ObjectProperty[Window] =
@@ -60,7 +82,8 @@ class DLCPaneModel(resultArea: TextArea, oracleInfoArea: TextArea) {
 
   def printDLCDialogResult[T <: CliCommand](
       caption: String,
-      dialog: DLCDialog[T]): Unit = {
+      dialog: DLCDialog[T],
+      postProcessStr: String => String = str => str): Unit = {
     val result = dialog.showAndWait(parentWindow.value)
 
     result match {
@@ -69,7 +92,8 @@ class DLCPaneModel(resultArea: TextArea, oracleInfoArea: TextArea) {
           caption = caption,
           op = {
             ConsoleCli.exec(command, GlobalData.consoleCliConfig) match {
-              case Success(commandReturn) => resultArea.text = commandReturn
+              case Success(commandReturn) =>
+                resultArea.text = postProcessStr(commandReturn)
               case Failure(err) =>
                 err.printStackTrace()
                 resultArea.text = s"Error executing command:\n${err.getMessage}"
@@ -218,7 +242,9 @@ class DLCPaneModel(resultArea: TextArea, oracleInfoArea: TextArea) {
   }
 
   def onGetFunding(): Unit = {
-    printDLCDialogResult("GetDLCFundingTx", new GetFundingDLCDialog)
+    printDLCDialogResult("GetDLCFundingTx",
+                         new GetFundingDLCDialog,
+                         txPrintFunc)
   }
 
   def onExecute(): Unit = {
diff --git a/app/server-test/src/test/scala/org/bitcoins/server/RoutesSpec.scala b/app/server-test/src/test/scala/org/bitcoins/server/RoutesSpec.scala
index e9e1cc1c4a..6323bda8b2 100644
--- a/app/server-test/src/test/scala/org/bitcoins/server/RoutesSpec.scala
+++ b/app/server-test/src/test/scala/org/bitcoins/server/RoutesSpec.scala
@@ -1,10 +1,11 @@
 package org.bitcoins.server
 
 import java.time.{ZoneId, ZonedDateTime}
-
 import akka.http.scaladsl.model.ContentTypes._
 import akka.http.scaladsl.server.ValidationRejection
-import akka.http.scaladsl.testkit.ScalatestRouteTest
+import akka.http.scaladsl.testkit.{RouteTestTimeout, ScalatestRouteTest}
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc._
 import org.bitcoins.core.Core
 import org.bitcoins.core.api.chain.ChainApi
 import org.bitcoins.core.api.wallet.db._
@@ -20,18 +21,22 @@ import org.bitcoins.core.protocol.BlockStamp.{
   BlockTime,
   InvalidBlockStamp
 }
-import org.bitcoins.core.protocol.script.EmptyScriptWitness
+import org.bitcoins.core.protocol.script.{EmptyScriptWitness, P2WPKHWitnessV0}
+import org.bitcoins.core.protocol.tlv._
 import org.bitcoins.core.protocol.transaction._
-import org.bitcoins.core.protocol.{BitcoinAddress, BlockStamp, P2PKHAddress}
+import org.bitcoins.core.protocol.{
+  Bech32Address,
+  BitcoinAddress,
+  BlockStamp,
+  P2PKHAddress
+}
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
 import org.bitcoins.core.psbt.PSBT
 import org.bitcoins.core.util.FutureUtil
 import org.bitcoins.core.wallet.fee.{FeeUnit, SatoshisPerVirtualByte}
 import org.bitcoins.core.wallet.utxo._
-import org.bitcoins.crypto.{
-  DoubleSha256DigestBE,
-  ECPublicKey,
-  Sha256Hash160Digest
-}
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.wallet.models._
 import org.bitcoins.node.Node
 import org.bitcoins.server.BitcoinSAppConfig.implicitToWalletConf
 import org.bitcoins.testkit.BitcoinSTestAppConfig
@@ -44,12 +49,15 @@ import ujson._
 
 import scala.collection.mutable
 import scala.concurrent.{ExecutionContext, Future}
+import scala.concurrent.duration.DurationInt
 
 class RoutesSpec extends AnyWordSpec with ScalatestRouteTest with MockFactory {
 
   implicit val conf: BitcoinSAppConfig =
     BitcoinSTestAppConfig.getSpvTestConfig()
 
+  implicit val timeout: RouteTestTimeout = RouteTestTimeout(5.seconds)
+
   // the genesis address
   val testAddressStr = "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
   val testAddress = BitcoinAddress.fromString(testAddressStr)
@@ -732,6 +740,330 @@ class RoutesSpec extends AnyWordSpec with ScalatestRouteTest with MockFactory {
       }
     }
 
+    val contractInfoDigests =
+      Vector("ffbbcde836cee437a2fa4ef7db1ea3d79ca71c0c821d2a197dda51bc6534f562",
+             "e770f42c578084a4a096ce1085f7fe508f8d908d2c5e6e304b2c3eab9bc973ea")
+
+    val contractInfo = SingleNonceContractInfo.fromStringVec(
+      Vector(
+        (contractInfoDigests.head, Satoshis(5)),
+        (contractInfoDigests.last, Satoshis(4))
+      ))
+
+    val contractInfoTLV = contractInfo.toTLV
+
+    val contractMaturity = 1580323752
+    val contractTimeout = 1581323752
+
+    val dummyKey = ECPrivateKey.freshPrivateKey
+    val dummyPubKey = dummyKey.publicKey
+
+    val dummySig = dummyKey.sign(Sha256DigestBE.empty)
+
+    val dummyPartialSig = PartialSignature(dummyPubKey, dummySig)
+
+    val dummyScriptWitness: P2WPKHWitnessV0 = {
+      P2WPKHWitnessV0(dummyPartialSig.pubKey, dummyPartialSig.signature)
+    }
+
+    val dummyOracleSig = SchnorrDigitalSignature(
+      "65ace55b5d073cc7a1c783fa8c254692c421270fa988247e3c87627ffe804ed06c20bf779da91f82da3311b1d9e0a3a513409a15c66f25201280751177dad24c")
+
+    lazy val winStr: String = "WIN"
+
+    lazy val loseStr: String = "LOSE"
+
+    lazy val dummyOutcomeSigs: Vector[(EnumOutcome, ECAdaptorSignature)] =
+      Vector(EnumOutcome(winStr) -> ECAdaptorSignature.dummy,
+             EnumOutcome(loseStr) -> ECAdaptorSignature.dummy)
+
+    val dummyAddress = "bc1quq29mutxkgxmjfdr7ayj3zd9ad0ld5mrhh89l2"
+
+    val dummyDLCKeys =
+      DLCPublicKeys(dummyPubKey, BitcoinAddress(dummyAddress))
+
+    val paramHash = Sha256DigestBE(
+      "de462f212d95ca4cf5db54eee08f14be0ee934e9ecfc6e9b7014ecfa51ba7b66")
+
+    val contractId = ByteVector.fromValidHex(
+      "4c6eb53573aae186dbb1a93274cc00c795473d7cfe2cb69e7d185ee28a39b919")
+
+    val wtx: WitnessTransaction = WitnessTransaction(
+      "02000000000101a2619b5d58b209439c937e563018efcf174063ca011e4f177a5b14e5ba76211c0100000017160014614e9b96cbc7477eda98f0936385ded6b636f74efeffffff024e3f57c4000000001600147cf00288c2c1b3c5cdf275db532a1c15c514bb2fae1112000000000016001440efb02597b9e9d9bc968f12cec3347e2e264c570247304402205768c2ac8178539fd44721e2a7541bedd6b55654f095143514624203c133f7e8022060d51f33fc2b5c1f51f26c7f703de21be6246dbb5fb7e1c6919aae6d442610c6012102b99a63f166ef53ca67a5c55ae969e80c33456e07189f8457e3438f000be42c19307d1900")
+
+    val fundingInput: DLCFundingInputP2WPKHV0 =
+      DLCFundingInputP2WPKHV0(wtx, UInt32.zero, UInt32.zero)
+
+    val announcementTLV = OracleAnnouncementV0TLV(
+      "fdd8249426cbca0e5366f6688fd837a83d3fe34d103f8d88a3bdc40d648e47e43c6f70a7e65fb85d5de46779604b541ebe74d06b3c316446a6f97fcd23d6de8e1d7b9451f74577f8cab8361962ce642a8da4b1f48f8813ed243203cb50ebba45c789abf0fdd8223000015b0fb6b85a9badee0a826349822db7412f79c71efdd903eac94a10ee10d6e4425fe3da00fdd80604000101620161")
+
+    val oracleInfo = SingleNonceOracleInfo(announcementTLV.publicKey,
+                                           announcementTLV.eventTLV.nonces.head)
+
+    val offer = DLCOffer(
+      OracleAndContractInfo(oracleInfo, contractInfo),
+      dummyDLCKeys,
+      Satoshis(2500),
+      Vector(fundingInput, fundingInput),
+      Bech32Address.fromString(dummyAddress),
+      SatoshisPerVirtualByte.one,
+      DLCTimeouts(BlockStamp(contractMaturity), BlockStamp(contractTimeout))
+    )
+
+    "create a dlc offer" in {
+      (mockWalletApi
+        .createDLCOffer(_: OracleInfo,
+                        _: ContractInfoTLV,
+                        _: Satoshis,
+                        _: Option[FeeUnit],
+                        _: UInt32,
+                        _: UInt32))
+        .expects(
+          oracleInfo,
+          contractInfoTLV,
+          Satoshis(2500),
+          Some(SatoshisPerVirtualByte(Satoshis.one)),
+          UInt32(contractMaturity),
+          UInt32(contractTimeout)
+        )
+        .returning(Future.successful(offer))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand(
+          "createdlcoffer",
+          Arr(
+            Str(announcementTLV.hex),
+            Str(contractInfoTLV.hex),
+            Num(2500),
+            Num(1),
+            Num(contractMaturity),
+            Num(contractTimeout)
+          )
+        ))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(responseAs[String] == s"""{"result":"${LnMessage(
+          offer.toTLV).hex}","error":null}""")
+      }
+    }
+
+    val accept = DLCAccept(
+      Satoshis(1000),
+      dummyDLCKeys,
+      Vector(fundingInput),
+      Bech32Address
+        .fromString(dummyAddress),
+      CETSignatures(dummyOutcomeSigs, dummyPartialSig),
+      Sha256Digest.empty
+    )
+
+    "accept a dlc offer" in {
+      (mockWalletApi
+        .acceptDLCOffer(_: DLCOfferTLV))
+        .expects(offer.toTLV)
+        .returning(Future.successful(accept))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("acceptdlcoffer", Arr(Str(LnMessage(offer.toTLV).hex))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(responseAs[String] == s"""{"result":"${LnMessage(
+          accept.toTLV).hex}","error":null}""")
+      }
+    }
+
+    val sign = DLCSign(
+      CETSignatures(dummyOutcomeSigs, dummyPartialSig),
+      FundingSignatures(Vector((EmptyTransactionOutPoint, dummyScriptWitness))),
+      paramHash.bytes
+    )
+
+    "sign a dlc" in {
+
+      (mockWalletApi
+        .signDLC(_: DLCAcceptTLV))
+        .expects(accept.toTLV)
+        .returning(Future.successful(sign))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("signdlc", Arr(Str(LnMessage(accept.toTLV).hex))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(responseAs[String] == s"""{"result":"${LnMessage(
+          sign.toTLV).hex}","error":null}""")
+      }
+    }
+
+    "add dlc sigs" in {
+
+      (mockWalletApi
+        .addDLCSigs(_: DLCSignTLV))
+        .expects(sign.toTLV)
+        .returning(Future.successful(DLCDb(
+          paramHash = paramHash,
+          tempContractId = Sha256Digest.empty,
+          contractIdOpt = Some(contractId),
+          state = DLCState.Signed,
+          isInitiator = false,
+          account = HDAccount(HDCoin(HDPurpose(89), HDCoinType.Testnet), 0),
+          keyIndex = 0,
+          oracleSigsOpt = None,
+          fundingOutPointOpt = None,
+          fundingTxIdOpt = None,
+          closingTxIdOpt = None,
+          outcomeOpt = None
+        )))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("adddlcsigs", Arr(Str(LnMessage(sign.toTLV).hex))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(responseAs[
+          String] == s"""{"result":"Successfully added sigs to DLC ${contractId.toHex}","error":null}""")
+      }
+    }
+
+    "get dlc funding tx" in {
+      (mockWalletApi
+        .getDLCFundingTx(_: ByteVector))
+        .expects(contractId)
+        .returning(Future.successful(EmptyTransaction))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("getdlcfundingtx", Arr(Str(contractId.toHex))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(
+          responseAs[
+            String] == s"""{"result":"${EmptyTransaction.hex}","error":null}""")
+      }
+    }
+
+    "broadcast dlc funding tx" in {
+      (mockWalletApi
+        .broadcastDLCFundingTx(_: ByteVector))
+        .expects(contractId)
+        .returning(Future.successful(EmptyTransaction))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("broadcastdlcfundingtx", Arr(Str(contractId.toHex))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(
+          responseAs[
+            String] == s"""{"result":"${EmptyTransaction.hex}","error":null}""")
+      }
+    }
+
+    "execute a dlc" in {
+      (mockWalletApi
+        .executeDLC(_: ByteVector, _: Vector[SchnorrDigitalSignature]))
+        .expects(contractId, Vector(dummyOracleSig))
+        .returning(Future.successful(EmptyTransaction))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand(
+          "executedlc",
+          Arr(Str(contractId.toHex), Arr(Str(dummyOracleSig.hex)), Bool(true))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(
+          responseAs[
+            String] == s"""{"result":"${EmptyTransaction.hex}","error":null}""")
+      }
+    }
+
+    "execute a dlc with multiple sigs" in {
+      (mockWalletApi
+        .executeDLC(_: ByteVector, _: Vector[SchnorrDigitalSignature]))
+        .expects(contractId, Vector(dummyOracleSig, dummyOracleSig))
+        .returning(Future.successful(EmptyTransaction))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("executedlc",
+                      Arr(Str(contractId.toHex),
+                          Arr(Str(dummyOracleSig.hex), Str(dummyOracleSig.hex)),
+                          Bool(true))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(
+          responseAs[
+            String] == s"""{"result":"${EmptyTransaction.hex}","error":null}""")
+      }
+    }
+
+    "execute a dlc with broadcast" in {
+      (mockWalletApi
+        .executeDLC(_: ByteVector, _: Vector[SchnorrDigitalSignature]))
+        .expects(contractId, Vector(dummyOracleSig))
+        .returning(Future.successful(EmptyTransaction))
+
+      (mockWalletApi.broadcastTransaction _)
+        .expects(EmptyTransaction)
+        .returning(FutureUtil.unit)
+        .anyNumberOfTimes()
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("executedlc",
+                      Arr(Str(contractId.toHex),
+                          Arr(Str(dummyOracleSig.hex)),
+                          Bool(false))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(
+          responseAs[String] == s"""{"result":"${EmptyTransaction.txIdBE.hex}","error":null}""")
+      }
+    }
+
+    "execute a dlc refund" in {
+      (mockWalletApi
+        .executeDLCRefund(_: ByteVector))
+        .expects(contractId)
+        .returning(Future.successful(EmptyTransaction))
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("executedlcrefund",
+                      Arr(Str(contractId.toHex), Bool(true))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(
+          responseAs[
+            String] == s"""{"result":"${EmptyTransaction.hex}","error":null}""")
+      }
+    }
+
+    "execute a dlc refund with broadcast" in {
+      (mockWalletApi
+        .executeDLCRefund(_: ByteVector))
+        .expects(contractId)
+        .returning(Future.successful(EmptyTransaction))
+
+      (mockWalletApi.broadcastTransaction _)
+        .expects(EmptyTransaction)
+        .returning(FutureUtil.unit)
+        .anyNumberOfTimes()
+
+      val route = walletRoutes.handleCommand(
+        ServerCommand("executedlcrefund",
+                      Arr(Str(contractId.toHex), Bool(false))))
+
+      Post() ~> route ~> check {
+        assert(contentType == `application/json`)
+        assert(
+          responseAs[String] == s"""{"result":"${EmptyTransaction.txIdBE.hex}","error":null}""")
+      }
+    }
+
     "send to an address" in {
       // positive cases
 
@@ -748,7 +1080,7 @@ class RoutesSpec extends AnyWordSpec with ScalatestRouteTest with MockFactory {
 
       val route = walletRoutes.handleCommand(
         ServerCommand("sendtoaddress",
-                      Arr(Str(testAddressStr), Num(100), Num(4), Bool(true))))
+                      Arr(Str(testAddressStr), Num(100), Num(4), Bool(false))))
 
       Post() ~> route ~> check {
         assert(contentType == `application/json`)
diff --git a/app/server-test/src/test/scala/org/bitcoins/wallet/MockWalletApi.scala b/app/server-test/src/test/scala/org/bitcoins/wallet/MockWalletApi.scala
index 8288e5864c..ec465141e8 100644
--- a/app/server-test/src/test/scala/org/bitcoins/wallet/MockWalletApi.scala
+++ b/app/server-test/src/test/scala/org/bitcoins/wallet/MockWalletApi.scala
@@ -1,9 +1,9 @@
 package org.bitcoins.wallet
 
-import org.bitcoins.core.api.wallet.AnyHDWalletApi
 import org.bitcoins.core.api.wallet.db.AccountDb
 import org.bitcoins.core.hd.AddressType
 import org.bitcoins.core.protocol.BitcoinAddress
+import org.bitcoins.dlc.wallet.AnyDLCHDWalletApi
 
 import scala.concurrent.Future
 
@@ -11,7 +11,7 @@ import scala.concurrent.Future
   * ScalaMock cannot stub traits with protected methods,
   * so we need to stub them manually.
   */
-abstract class MockWalletApi extends AnyHDWalletApi {
+abstract class MockWalletApi extends AnyDLCHDWalletApi {
 
   override def getNewChangeAddress(account: AccountDb): Future[BitcoinAddress] =
     stub
diff --git a/app/server/src/main/scala/org/bitcoins/server/BitcoinSAppConfig.scala b/app/server/src/main/scala/org/bitcoins/server/BitcoinSAppConfig.scala
index f154d762ef..b6c3ea5bec 100644
--- a/app/server/src/main/scala/org/bitcoins/server/BitcoinSAppConfig.scala
+++ b/app/server/src/main/scala/org/bitcoins/server/BitcoinSAppConfig.scala
@@ -6,6 +6,7 @@ import com.typesafe.config.{Config, ConfigFactory}
 import org.bitcoins.chain.config.ChainAppConfig
 import org.bitcoins.core.util.StartStopAsync
 import org.bitcoins.db.AppConfig
+import org.bitcoins.dlc.wallet.DLCAppConfig
 import org.bitcoins.keymanager.config.KeyManagerAppConfig
 import org.bitcoins.node.config.NodeAppConfig
 import org.bitcoins.wallet.config.WalletAppConfig
@@ -29,6 +30,7 @@ case class BitcoinSAppConfig(
   lazy val walletConf: WalletAppConfig = WalletAppConfig(directory, confs: _*)
   lazy val nodeConf: NodeAppConfig = NodeAppConfig(directory, confs: _*)
   lazy val chainConf: ChainAppConfig = ChainAppConfig(directory, confs: _*)
+  lazy val dlcConf: DLCAppConfig = DLCAppConfig(directory, confs: _*)
 
   lazy val kmConf: KeyManagerAppConfig =
     KeyManagerAppConfig(directory, confs: _*)
@@ -42,7 +44,8 @@ case class BitcoinSAppConfig(
                        walletConf.start(),
                        nodeConf.start(),
                        chainConf.start(),
-                       bitcoindRpcConf.start())
+                       bitcoindRpcConf.start(),
+                       dlcConf.start())
 
     Future.sequence(futures).map(_ => ())
   }
diff --git a/app/server/src/main/scala/org/bitcoins/server/BitcoinSServerMain.scala b/app/server/src/main/scala/org/bitcoins/server/BitcoinSServerMain.scala
index db2424d551..b146160ac6 100644
--- a/app/server/src/main/scala/org/bitcoins/server/BitcoinSServerMain.scala
+++ b/app/server/src/main/scala/org/bitcoins/server/BitcoinSServerMain.scala
@@ -12,6 +12,7 @@ import org.bitcoins.core.api.feeprovider.FeeRateApi
 import org.bitcoins.core.api.node.NodeApi
 import org.bitcoins.core.util.{FutureUtil, NetworkUtil}
 import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.dlc.wallet._
 import org.bitcoins.feeprovider.FeeProviderName._
 import org.bitcoins.feeprovider.MempoolSpaceTarget.HourFeeTarget
 import org.bitcoins.feeprovider._
@@ -36,6 +37,7 @@ class BitcoinSServerMain(override val args: Array[String])
     implicit val walletConf: WalletAppConfig = conf.walletConf
     implicit val nodeConf: NodeAppConfig = conf.nodeConf
     implicit val chainConf: ChainAppConfig = conf.chainConf
+    implicit val dlcConf: DLCAppConfig = conf.dlcConf
     implicit val bitcoindRpcConf: BitcoindRpcAppConfig = conf.bitcoindRpcConf
 
     def startBitcoinSBackend(): Future[Unit] = {
@@ -69,7 +71,7 @@ class BitcoinSServerMain(override val args: Array[String])
         chainApi <- chainApiF
         _ = logger.info("Initialized chain api")
         feeProvider = getFeeProviderOrElse(MempoolSpaceProvider(HourFeeTarget))
-        wallet <- walletConf.createHDWallet(node, chainApi, feeProvider)
+        wallet <- dlcConf.createDLCWallet(node, chainApi, feeProvider)
         callbacks <- createCallbacks(wallet)
         _ = nodeConf.addCallbacks(callbacks)
       } yield {
@@ -129,10 +131,10 @@ class BitcoinSServerMain(override val args: Array[String])
         _ <- bitcoindRpcConf.start()
         _ = logger.info("Creating wallet")
         feeProvider = getFeeProviderOrElse(bitcoind)
-        tmpWallet <- walletConf.createHDWallet(nodeApi = bitcoind,
-                                               chainQueryApi = bitcoind,
-                                               feeRateApi = feeProvider)
-        wallet = BitcoindRpcBackendUtil.createWalletWithBitcoindCallbacks(
+        tmpWallet <- dlcConf.createDLCWallet(nodeApi = bitcoind,
+                                             chainQueryApi = bitcoind,
+                                             feeRateApi = feeProvider)
+        wallet = BitcoindRpcBackendUtil.createDLCWalletWithBitcoindCallbacks(
           bitcoind,
           tmpWallet)
         _ = logger.info("Starting wallet")
@@ -265,7 +267,7 @@ class BitcoinSServerMain(override val args: Array[String])
   private def startHttpServer(
       nodeApi: NodeApi,
       chainApi: ChainApi,
-      wallet: Wallet,
+      wallet: DLCWallet,
       rpcPortOpt: Option[Int])(implicit
       system: ActorSystem,
       conf: BitcoinSAppConfig): Future[Http.ServerBinding] = {
diff --git a/app/server/src/main/scala/org/bitcoins/server/BitcoindRpcBackendUtil.scala b/app/server/src/main/scala/org/bitcoins/server/BitcoindRpcBackendUtil.scala
index 08bf4621b2..2e101fc90f 100644
--- a/app/server/src/main/scala/org/bitcoins/server/BitcoindRpcBackendUtil.scala
+++ b/app/server/src/main/scala/org/bitcoins/server/BitcoindRpcBackendUtil.scala
@@ -9,6 +9,7 @@ import org.bitcoins.core.protocol.blockchain.Block
 import org.bitcoins.core.protocol.transaction.Transaction
 import org.bitcoins.core.util.{BitcoinSLogger, FutureUtil}
 import org.bitcoins.crypto.DoubleSha256Digest
+import org.bitcoins.dlc.wallet.DLCWallet
 import org.bitcoins.rpc.client.common.BitcoindRpcClient
 import org.bitcoins.wallet.Wallet
 import org.bitcoins.zmq.ZMQSubscriber
@@ -107,6 +108,32 @@ object BitcoindRpcBackendUtil extends BitcoinSLogger {
     pairedWallet
   }
 
+  def createDLCWalletWithBitcoindCallbacks(
+      bitcoind: BitcoindRpcClient,
+      wallet: DLCWallet)(implicit ec: ExecutionContext): DLCWallet = {
+    // Kill the old wallet
+    wallet.stopWalletThread()
+
+    // We need to create a promise so we can inject the wallet with the callback
+    // after we have created it into SyncUtil.getNodeApiWalletCallback
+    // so we don't lose the internal state of the wallet
+    val walletCallbackP = Promise[Wallet]()
+
+    val pairedWallet = DLCWallet(
+      keyManager = wallet.keyManager,
+      nodeApi =
+        BitcoindRpcBackendUtil.getNodeApiWalletCallback(bitcoind,
+                                                        walletCallbackP.future),
+      chainQueryApi = bitcoind,
+      feeRateApi = wallet.feeRateApi,
+      creationTime = wallet.keyManager.creationTime
+    )(wallet.walletConfig, wallet.dlcConfig, wallet.ec)
+
+    walletCallbackP.success(pairedWallet)
+
+    pairedWallet
+  }
+
   def createZMQWalletCallbacks(wallet: Wallet)(implicit
       bitcoindRpcConf: BitcoindRpcAppConfig): ZMQSubscriber = {
     require(bitcoindRpcConf.zmqPortOpt.isDefined,
diff --git a/app/server/src/main/scala/org/bitcoins/server/ServerJsonModels.scala b/app/server/src/main/scala/org/bitcoins/server/ServerJsonModels.scala
index 69440c8157..b24d4672a8 100644
--- a/app/server/src/main/scala/org/bitcoins/server/ServerJsonModels.scala
+++ b/app/server/src/main/scala/org/bitcoins/server/ServerJsonModels.scala
@@ -1,10 +1,13 @@
 package org.bitcoins.server
 
+import java.io.File
+import java.nio.file.Path
 import java.time.Instant
 
 import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.LockUnspentOutputParameter
 import org.bitcoins.core.api.wallet.CoinSelectionAlgo
 import org.bitcoins.core.currency.{Bitcoins, Satoshis}
+import org.bitcoins.core.number.UInt32
 import org.bitcoins.core.protocol.BlockStamp.BlockHeight
 import org.bitcoins.core.protocol.tlv._
 import org.bitcoins.core.protocol.transaction.{Transaction, TransactionOutPoint}
@@ -12,7 +15,8 @@ import org.bitcoins.core.protocol.{BitcoinAddress, BlockStamp}
 import org.bitcoins.core.psbt.PSBT
 import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
 import org.bitcoins.core.wallet.utxo.AddressLabelTag
-import org.bitcoins.crypto.AesPassword
+import org.bitcoins.crypto._
+import scodec.bits.ByteVector
 import ujson._
 import upickle.default._
 
@@ -477,6 +481,244 @@ object SendToAddress extends ServerJsonModels {
 
 }
 
+case class GetDLC(paramHash: Sha256DigestBE)
+
+object GetDLC extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[GetDLC] = {
+    jsArr.arr.toList match {
+      case paramHashJs :: Nil =>
+        Try {
+          val paramHash = Sha256DigestBE(paramHashJs.str)
+          GetDLC(paramHash)
+        }
+      case Nil =>
+        Failure(new IllegalArgumentException("Missing paramHash argument"))
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 1"))
+    }
+  }
+}
+
+case class CreateDLCOffer(
+    announcement: OracleAnnouncementTLV,
+    contractInfoTLV: ContractInfoTLV,
+    collateral: Satoshis,
+    feeRateOpt: Option[SatoshisPerVirtualByte],
+    locktime: UInt32,
+    refundLocktime: UInt32)
+
+object CreateDLCOffer extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[CreateDLCOffer] = {
+
+    jsArr.arr.toList match {
+      case announcementJs :: contractInfoJs :: collateralJs :: feeRateOptJs :: locktimeJs :: refundLTJs :: Nil =>
+        Try {
+          val announcement = jsToOracleAnnouncementTLV(announcementJs)
+          val contractInfoTLV = jsToContractInfoTLV(contractInfoJs)
+          val collateral = jsToSatoshis(collateralJs)
+          val feeRate = jsToSatoshisPerVirtualByteOpt(feeRateOptJs)
+          val locktime = jsToUInt32(locktimeJs)
+          val refundLT = jsToUInt32(refundLTJs)
+          CreateDLCOffer(announcement,
+                         contractInfoTLV,
+                         collateral,
+                         feeRate,
+                         locktime,
+                         refundLT)
+        }
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 6"))
+    }
+  }
+}
+
+case class AcceptDLCOffer(offer: LnMessage[DLCOfferTLV])
+
+object AcceptDLCOffer extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[AcceptDLCOffer] = {
+    jsArr.arr.toList match {
+      case offerJs :: Nil =>
+        Try {
+          val offer = LnMessageFactory(DLCOfferTLV).fromHex(offerJs.str)
+          AcceptDLCOffer(offer)
+        }
+      case Nil =>
+        Failure(new IllegalArgumentException("Missing offer argument"))
+
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 1"))
+    }
+  }
+}
+
+case class SignDLC(accept: LnMessage[DLCAcceptTLV])
+
+object SignDLC extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[SignDLC] = {
+    jsArr.arr.toList match {
+      case acceptJs :: Nil =>
+        Try {
+          val accept = LnMessageFactory(DLCAcceptTLV).fromHex(acceptJs.str)
+          SignDLC(accept)
+        }
+      case Nil =>
+        Failure(new IllegalArgumentException("Missing accept argument"))
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 1"))
+    }
+  }
+}
+
+case class AddDLCSigs(sigs: LnMessage[DLCSignTLV])
+
+object AddDLCSigs extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[AddDLCSigs] = {
+    jsArr.arr.toList match {
+      case sigsJs :: Nil =>
+        Try {
+          val sigs = LnMessageFactory(DLCSignTLV).fromHex(sigsJs.str)
+          AddDLCSigs(sigs)
+        }
+      case Nil =>
+        Failure(new IllegalArgumentException("Missing sigs argument"))
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 1"))
+    }
+  }
+}
+
+case class DLCDataFromFile(path: Path)
+
+object DLCDataFromFile extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[DLCDataFromFile] = {
+    jsArr.arr.toList match {
+      case pathJs :: Nil =>
+        Try {
+          val path = new File(pathJs.str).toPath
+          DLCDataFromFile(path)
+        }
+      case Nil =>
+        Failure(new IllegalArgumentException("Missing path argument"))
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 1"))
+    }
+  }
+}
+
+case class GetDLCFundingTx(contractId: ByteVector)
+
+object GetDLCFundingTx extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[GetDLCFundingTx] = {
+    jsArr.arr.toList match {
+      case contractIdJs :: Nil =>
+        Try {
+          val contractId = ByteVector.fromValidHex(contractIdJs.str)
+          GetDLCFundingTx(contractId)
+        }
+      case Nil =>
+        Failure(new IllegalArgumentException("Missing contractId argument"))
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 1"))
+    }
+  }
+}
+
+case class BroadcastDLCFundingTx(contractId: ByteVector)
+
+object BroadcastDLCFundingTx extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[BroadcastDLCFundingTx] = {
+    jsArr.arr.toList match {
+      case contractIdJs :: Nil =>
+        Try {
+          val contractId = ByteVector.fromValidHex(contractIdJs.str)
+          BroadcastDLCFundingTx(contractId)
+        }
+      case Nil =>
+        Failure(new IllegalArgumentException("Missing contractId argument"))
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 1"))
+    }
+  }
+}
+
+case class ExecuteDLC(
+    contractId: ByteVector,
+    oracleSigs: Vector[SchnorrDigitalSignature],
+    noBroadcast: Boolean)
+    extends Broadcastable
+
+object ExecuteDLC extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[ExecuteDLC] = {
+    jsArr.arr.toList match {
+      case contractIdJs :: oracleSigsJs :: noBroadcastJs :: Nil =>
+        Try {
+          val contractId = ByteVector.fromValidHex(contractIdJs.str)
+          val oracleSigs = jsToSchnorrDigitalSignatureVec(oracleSigsJs)
+          val noBroadcast = noBroadcastJs.bool
+
+          ExecuteDLC(contractId, oracleSigs, noBroadcast)
+        }
+      case Nil =>
+        Failure(
+          new IllegalArgumentException(
+            "Missing contractId, oracleSig, and noBroadcast arguments"))
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 3"))
+    }
+  }
+}
+
+case class ExecuteDLCRefund(contractId: ByteVector, noBroadcast: Boolean)
+    extends Broadcastable
+
+object ExecuteDLCRefund extends ServerJsonModels {
+
+  def fromJsArr(jsArr: ujson.Arr): Try[ExecuteDLCRefund] = {
+    jsArr.arr.toList match {
+      case contractIdJs :: noBroadcastJs :: Nil =>
+        Try {
+          val contractId = ByteVector.fromValidHex(contractIdJs.str)
+          val noBroadcast = noBroadcastJs.bool
+
+          ExecuteDLCRefund(contractId, noBroadcast)
+        }
+      case Nil =>
+        Failure(new IllegalArgumentException("Missing contractId argument"))
+      case other =>
+        Failure(
+          new IllegalArgumentException(
+            s"Bad number of arguments: ${other.length}. Expected: 2"))
+    }
+  }
+}
+
 case class SendFromOutpoints(
     outPoints: Vector[TransactionOutPoint],
     address: BitcoinAddress,
@@ -814,6 +1056,54 @@ object GetEvent extends ServerJsonModels {
 
 trait ServerJsonModels {
 
+  def jsToOracleAnnouncementTLV(js: Value): OracleAnnouncementTLV =
+    js match {
+      case str: Str =>
+        OracleAnnouncementTLV(str.value)
+      case _: Value =>
+        throw Value.InvalidData(
+          js,
+          "Expected an OracleAnnouncementTLV as a hex string")
+    }
+
+  def jsToContractInfoTLV(js: Value): ContractInfoTLV =
+    js match {
+      case str: Str =>
+        ContractInfoTLV(str.value)
+      case _: Value =>
+        throw Value.InvalidData(js, "Expected a ContractInfo as a hex string")
+    }
+
+  def jsToSatoshisPerVirtualByteOpt(js: Value): Option[SatoshisPerVirtualByte] =
+    nullToOpt(js).map {
+      case str: Str =>
+        SatoshisPerVirtualByte(Satoshis(str.value))
+      case num: Num =>
+        SatoshisPerVirtualByte(Satoshis(num.value.toLong))
+      case _: Value =>
+        throw Value.InvalidData(js, "Expected a fee rate in sats/vbyte")
+    }
+
+  def jsToUInt32(js: Value): UInt32 =
+    js match {
+      case str: Str =>
+        UInt32(BigInt(str.value))
+      case num: Num =>
+        UInt32(num.value.toLong)
+      case _: Value =>
+        throw Value.InvalidData(js, "Expected a UInt32")
+    }
+
+  def jsToSatoshis(js: Value): Satoshis =
+    js match {
+      case str: Str =>
+        Satoshis(BigInt(str.value))
+      case num: Num =>
+        Satoshis(num.value.toLong)
+      case _: Value =>
+        throw Value.InvalidData(js, "Expected value in Satoshis")
+    }
+
   def jsToBitcoinAddress(js: Value): BitcoinAddress = {
     try {
       BitcoinAddress.fromString(js.str)
@@ -859,4 +1149,20 @@ trait ServerJsonModels {
       case Arr(arr) if arr.size == 1 => Some(arr.head)
       case _: Value                  => Some(value)
     }
+
+  def jsToSchnorrDigitalSignature(js: Value): SchnorrDigitalSignature =
+    js match {
+      case str: Str =>
+        SchnorrDigitalSignature(str.value)
+      case _: Value =>
+        throw Value.InvalidData(
+          js,
+          "Expected a SchnorrDigitalSignature as a hex string")
+    }
+
+  def jsToSchnorrDigitalSignatureVec(
+      js: Value): Vector[SchnorrDigitalSignature] = {
+    js.arr.foldLeft(Vector.empty[SchnorrDigitalSignature])((vec, sig) =>
+      vec :+ jsToSchnorrDigitalSignature(sig))
+  }
 }
diff --git a/app/server/src/main/scala/org/bitcoins/server/WalletRoutes.scala b/app/server/src/main/scala/org/bitcoins/server/WalletRoutes.scala
index 62ec536e66..0c5397a595 100644
--- a/app/server/src/main/scala/org/bitcoins/server/WalletRoutes.scala
+++ b/app/server/src/main/scala/org/bitcoins/server/WalletRoutes.scala
@@ -3,21 +3,25 @@ package org.bitcoins.server
 import akka.actor.ActorSystem
 import akka.http.scaladsl.server.Directives._
 import akka.http.scaladsl.server._
+import akka.stream.Materializer
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.OracleInfo
 import org.bitcoins.commons.serializers.Picklers._
-import org.bitcoins.core.api.wallet.AnyHDWalletApi
 import org.bitcoins.core.api.wallet.db.SpendingInfoDb
 import org.bitcoins.core.currency._
+import org.bitcoins.core.protocol.tlv._
 import org.bitcoins.core.protocol.transaction.Transaction
 import org.bitcoins.core.wallet.utxo.{AddressLabelTagType, TxoState}
 import org.bitcoins.crypto.NetworkElement
+import org.bitcoins.dlc.wallet.AnyDLCHDWalletApi
 import org.bitcoins.keymanager.WalletStorage
 import org.bitcoins.wallet.config.WalletAppConfig
 import ujson._
 
+import java.nio.file.Files
 import scala.concurrent.Future
 import scala.util.{Failure, Success}
 
-case class WalletRoutes(wallet: AnyHDWalletApi)(implicit
+case class WalletRoutes(wallet: AnyDLCHDWalletApi)(implicit
     system: ActorSystem,
     walletConf: WalletAppConfig)
     extends ServerRoute {
@@ -30,6 +34,9 @@ case class WalletRoutes(wallet: AnyHDWalletApi)(implicit
     )
   }
 
+  implicit val materializer: Materializer =
+    Materializer.createMaterializer(system)
+
   private def handleBroadcastable(
       tx: Transaction,
       noBroadcast: Boolean): Future[NetworkElement] = {
@@ -208,6 +215,210 @@ case class WalletRoutes(wallet: AnyHDWalletApi)(implicit
           }
       }
 
+    case ServerCommand("getdlcs", _) =>
+      complete {
+        wallet.listDLCs().map { dlcs =>
+          Server.httpSuccess(dlcs.map(_.toJson))
+        }
+      }
+
+    case ServerCommand("getdlc", arr) =>
+      GetDLC.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(GetDLC(paramHash)) =>
+          complete {
+            wallet.findDLC(paramHash).map {
+              case None => Server.httpSuccess(ujson.Null)
+              case Some(dlc) =>
+                Server.httpSuccess(dlc.toJson)
+            }
+          }
+      }
+
+    case ServerCommand("createdlcoffer", arr) =>
+      CreateDLCOffer.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(
+              CreateDLCOffer(announcement,
+                             contractInfo,
+                             collateral,
+                             feeRateOpt,
+                             locktime,
+                             refundLT)) =>
+          complete {
+            if (!announcement.validateSignature) {
+              throw new RuntimeException(
+                s"Received Oracle announcement with invalid signature! ${announcement.hex}")
+            }
+
+            val oracleInfo = OracleInfo.fromOracleAnnouncement(announcement)
+
+            wallet
+              .createDLCOffer(oracleInfo,
+                              contractInfo,
+                              collateral,
+                              feeRateOpt,
+                              locktime,
+                              refundLT)
+              .map { offer =>
+                Server.httpSuccess(offer.toMessage.hex)
+              }
+          }
+      }
+
+    case ServerCommand("acceptdlcoffer", arr) =>
+      AcceptDLCOffer.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(AcceptDLCOffer(offer)) =>
+          complete {
+            wallet
+              .acceptDLCOffer(offer.tlv)
+              .map { accept =>
+                Server.httpSuccess(accept.toMessage.hex)
+              }
+          }
+      }
+
+    case ServerCommand("acceptdlcofferfromfile", arr) =>
+      DLCDataFromFile.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(DLCDataFromFile(path)) =>
+          complete {
+
+            val hex = Files.readAllLines(path).get(0)
+
+            val offerMessage = LnMessageFactory(DLCOfferTLV).fromHex(hex)
+
+            wallet
+              .acceptDLCOffer(offerMessage.tlv)
+              .map { accept =>
+                Server.httpSuccess(accept.toMessage.hex)
+              }
+          }
+      }
+
+    case ServerCommand("signdlc", arr) =>
+      SignDLC.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(SignDLC(accept)) =>
+          complete {
+            wallet
+              .signDLC(accept.tlv)
+              .map { sign =>
+                Server.httpSuccess(sign.toMessage.hex)
+              }
+          }
+      }
+
+    case ServerCommand("signdlcfromfile", arr) =>
+      DLCDataFromFile.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(DLCDataFromFile(path)) =>
+          complete {
+
+            val hex = Files.readAllLines(path).get(0)
+
+            val acceptMessage = LnMessageFactory(DLCAcceptTLV).fromHex(hex)
+
+            wallet
+              .signDLC(acceptMessage.tlv)
+              .map { sign =>
+                Server.httpSuccess(sign.toMessage.hex)
+              }
+          }
+      }
+
+    case ServerCommand("adddlcsigs", arr) =>
+      AddDLCSigs.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(AddDLCSigs(sigs)) =>
+          complete {
+            wallet.addDLCSigs(sigs.tlv).map { db =>
+              Server.httpSuccess(
+                s"Successfully added sigs to DLC ${db.contractIdOpt.get.toHex}")
+            }
+          }
+      }
+
+    case ServerCommand("adddlcsigsfromfile", arr) =>
+      DLCDataFromFile.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(DLCDataFromFile(path)) =>
+          complete {
+
+            val hex = Files.readAllLines(path).get(0)
+
+            val signMessage = LnMessageFactory(DLCSignTLV).fromHex(hex)
+
+            wallet.addDLCSigs(signMessage.tlv).map { db =>
+              Server.httpSuccess(
+                s"Successfully added sigs to DLC ${db.contractIdOpt.get.toHex}")
+            }
+          }
+      }
+
+    case ServerCommand("getdlcfundingtx", arr) =>
+      GetDLCFundingTx.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(GetDLCFundingTx(contractId)) =>
+          complete {
+            wallet.getDLCFundingTx(contractId).map { tx =>
+              Server.httpSuccess(tx.hex)
+            }
+          }
+      }
+
+    case ServerCommand("broadcastdlcfundingtx", arr) =>
+      BroadcastDLCFundingTx.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(BroadcastDLCFundingTx(contractId)) =>
+          complete {
+            wallet.broadcastDLCFundingTx(contractId).map { tx =>
+              Server.httpSuccess(tx.hex)
+            }
+          }
+      }
+
+    case ServerCommand("executedlc", arr) =>
+      ExecuteDLC.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(ExecuteDLC(contractId, oracleSigs, noBroadcast)) =>
+          complete {
+            for {
+              tx <- wallet.executeDLC(contractId, oracleSigs)
+              retStr <- handleBroadcastable(tx, noBroadcast)
+            } yield {
+              Server.httpSuccess(retStr.hex)
+            }
+          }
+      }
+
+    case ServerCommand("executedlcrefund", arr) =>
+      ExecuteDLCRefund.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(ExecuteDLCRefund(contractId, noBroadcast)) =>
+          complete {
+            for {
+              tx <- wallet.executeDLCRefund(contractId)
+              retStr <- handleBroadcastable(tx, noBroadcast)
+            } yield {
+              Server.httpSuccess(retStr.hex)
+            }
+          }
+      }
+
     case ServerCommand("sendtoaddress", arr) =>
       // TODO create custom directive for this?
       SendToAddress.fromJsArr(arr) match {
@@ -223,9 +434,9 @@ case class WalletRoutes(wallet: AnyHDWalletApi)(implicit
               tx <- wallet.sendToAddress(address,
                                          bitcoins,
                                          satoshisPerVirtualByteOpt)
-              _ <- handleBroadcastable(tx, noBroadcast)
+              retStr <- handleBroadcastable(tx, noBroadcast)
             } yield {
-              Server.httpSuccess(tx.txIdBE)
+              Server.httpSuccess(retStr.hex)
             }
           }
       }
@@ -457,5 +668,15 @@ case class WalletRoutes(wallet: AnyHDWalletApi)(implicit
             Server.httpSuccess(ujson.Null)
           }
       }
+    case ServerCommand("decoderawtransaction", arr) =>
+      DecodeRawTransaction.fromJsArr(arr) match {
+        case Failure(exception) =>
+          reject(ValidationRejection("failure", Some(exception)))
+        case Success(DecodeRawTransaction(tx)) =>
+          complete {
+            val jsonStr = wallet.decodeRawTransaction(tx)
+            Server.httpSuccess(jsonStr)
+          }
+      }
   }
 }
diff --git a/build.sbt b/build.sbt
index 2517ed57a7..0d94ff9e8b 100644
--- a/build.sbt
+++ b/build.sbt
@@ -61,6 +61,14 @@ lazy val `bitcoin-s` = project
     feeProviderTest,
     dlcOracle,
     dlcOracleTest,
+    dlc,
+    dlcTest,
+    dlcWallet,
+    dlcWalletTest,
+    dlcOracle,
+    dlcOracleTest,
+    dlcSuredbitsClient,
+    dlcSuredbitsClientTest,
     bitcoindRpc,
     bitcoindRpcTest,
     bench,
@@ -259,7 +267,8 @@ lazy val appServer = project
     wallet,
     bitcoindRpc,
     feeProvider,
-    zmq
+    zmq,
+    dlcWallet
   )
 
 lazy val appServerTest = project
@@ -275,7 +284,8 @@ lazy val cli = project
   .in(file("app/cli"))
   .settings(CommonSettings.prodSettings: _*)
   .dependsOn(
-    appCommons
+    appCommons,
+    dlc
   )
 
 lazy val cliTest = project
@@ -298,6 +308,19 @@ lazy val gui = project
     cli
   )
 
+lazy val dlcSuredbitsClient = project
+  .in(file("app/dlc-suredbits-client"))
+  .settings(CommonSettings.prodSettings: _*)
+  .dependsOn(eclairRpc, wallet)
+
+lazy val dlcSuredbitsClientTest = project
+  .in(file("app/dlc-suredbits-client-test"))
+  .settings(CommonSettings.testSettings: _*)
+  .dependsOn(
+    dlcSuredbitsClient,
+    testkit
+  )
+
 lazy val chainDbSettings = dbFlywaySettings("chaindb")
 
 lazy val chain = project
@@ -446,7 +469,9 @@ lazy val testkit = project
     node,
     wallet,
     zmq,
-    dlcOracle
+    dlcOracle,
+    dlc,
+    dlcWallet
   )
 
 lazy val docs = project
@@ -487,7 +512,7 @@ lazy val wallet = project
     name := "bitcoin-s-wallet",
     libraryDependencies ++= Deps.wallet(scalaVersion.value)
   )
-  .dependsOn(core, appCommons, dbCommons, keyManager)
+  .dependsOn(core, appCommons, dbCommons, dlc, keyManager)
   .enablePlugins(FlywayPlugin)
 
 lazy val walletTest = project
@@ -522,6 +547,47 @@ lazy val dlcOracleTest = project
   )
   .dependsOn(core % testAndCompile, dlcOracle, testkit)
 
+lazy val dlc = project
+  .in(file("dlc"))
+  .settings(CommonSettings.prodSettings: _*)
+  .settings(
+    name := "bitcoin-s-dlc",
+    // version number needed for MicroJson
+    libraryDependencies ++= Deps.dlc
+  )
+  .dependsOn(core, appCommons)
+
+lazy val dlcTest = project
+  .in(file("dlc-test"))
+  .settings(CommonSettings.testSettings: _*)
+  .settings(
+    name := "bitcoin-s-dlc-test",
+    libraryDependencies ++= Deps.dlcTest
+  )
+  .dependsOn(
+    core % testAndCompile,
+    testkit,
+    dlc
+  )
+
+lazy val dlcWallet = project
+  .in(file("dlc-wallet"))
+  .settings(CommonSettings.prodSettings: _*)
+  .settings(
+    name := "bitcoin-s-dlc-wallet",
+    libraryDependencies ++= Deps.dlcWallet
+  )
+  .dependsOn(wallet, dlc)
+
+lazy val dlcWalletTest = project
+  .in(file("dlc-wallet-test"))
+  .settings(CommonSettings.testSettings: _*)
+  .settings(
+    name := "bitcoin-s-dlc-wallet-test",
+    libraryDependencies ++= Deps.dlcWalletTest
+  )
+  .dependsOn(core % testAndCompile, dlcWallet, testkit)
+
 /** Given a database name, returns the appropriate
   * Flyway settings we apply to a project (chain, node, wallet)
   */
diff --git a/core/src/main/scala-2.11/org/bitcoins/core/util/MapWrapper.scala b/core/src/main/scala-2.11/org/bitcoins/core/util/MapWrapper.scala
new file mode 100644
index 0000000000..9ec4d43cb6
--- /dev/null
+++ b/core/src/main/scala-2.11/org/bitcoins/core/util/MapWrapper.scala
@@ -0,0 +1,11 @@
+package org.bitcoins.core.util
+
+trait MapWrapper[K, +T] extends Map[K, T] {
+  protected def wrapped: Map[K, T]
+  override def +[B1 >: T](kv: (K, B1)): Map[K, B1] = wrapped.+(kv)
+  override def get(key: K): Option[T] = wrapped.get(key)
+  override def iterator: Iterator[(K, T)] = wrapped.iterator
+  override def updated[V1 >: T](key: K, value: V1): Map[K, V1] =
+    wrapped.updated(key, value)
+  override def -(key: K): Map[K, T] = wrapped.-(key)
+}
diff --git a/core/src/main/scala/org/bitcoins/core/api/wallet/WalletApi.scala b/core/src/main/scala/org/bitcoins/core/api/wallet/WalletApi.scala
index 0c209fa7a0..ba4e720e76 100644
--- a/core/src/main/scala/org/bitcoins/core/api/wallet/WalletApi.scala
+++ b/core/src/main/scala/org/bitcoins/core/api/wallet/WalletApi.scala
@@ -39,6 +39,8 @@ trait WalletApi extends StartStopAsync[WalletApi] {
   val feeRateApi: FeeRateApi
   val creationTime: Instant
 
+  def decodeRawTransaction(tx: Transaction): String
+
   def broadcastTransaction(transaction: Transaction): Future[Unit] =
     nodeApi.broadcastTransaction(transaction)
 
diff --git a/core/src/main/scala/org/bitcoins/core/protocol/transaction/TxUtil.scala b/core/src/main/scala/org/bitcoins/core/protocol/transaction/TxUtil.scala
index 0d26f9000a..048fe4b3c4 100644
--- a/core/src/main/scala/org/bitcoins/core/protocol/transaction/TxUtil.scala
+++ b/core/src/main/scala/org/bitcoins/core/protocol/transaction/TxUtil.scala
@@ -296,7 +296,7 @@ object TxUtil extends BitcoinSLogger {
         import scala.concurrent.ExecutionContext.Implicits.global
         import scala.concurrent.duration.DurationInt
 
-        Await.result(TxUtil.addDummySigs(tx, inputInfos), 5.seconds)
+        Await.result(TxUtil.addDummySigs(tx, inputInfos), 10.seconds)
       }
 
       val actualFee = creditingAmount - spentAmount
diff --git a/core/src/main/scala/org/bitcoins/core/psbt/PSBTMap.scala b/core/src/main/scala/org/bitcoins/core/psbt/PSBTMap.scala
index a2dc23ebe1..68174e06ff 100644
--- a/core/src/main/scala/org/bitcoins/core/psbt/PSBTMap.scala
+++ b/core/src/main/scala/org/bitcoins/core/psbt/PSBTMap.scala
@@ -673,7 +673,7 @@ case class InputPSBTMap(elements: Vector[InputPSBTRecord])
       tx.outputs(txIn.previousOutput.vout.toInt)
     } else {
       throw new UnsupportedOperationException(
-        "Not enough information in the InputPSBTMap to get a valid InputInfo")
+        s"Not enough information in the InputPSBTMap to get a valid InputInfo: $elements")
     }
 
     val redeemScriptOpt = finalizedScriptSigOpt match {
diff --git a/db-commons-test/src/test/scala/org/bitcoins/db/DbManagementTest.scala b/db-commons-test/src/test/scala/org/bitcoins/db/DbManagementTest.scala
index fae0fea6ab..42baa6614c 100644
--- a/db-commons-test/src/test/scala/org/bitcoins/db/DbManagementTest.scala
+++ b/db-commons-test/src/test/scala/org/bitcoins/db/DbManagementTest.scala
@@ -5,6 +5,7 @@ import org.bitcoins.chain.config.ChainAppConfig
 import org.bitcoins.chain.db.ChainDbManagement
 import org.bitcoins.db.DatabaseDriver._
 import org.bitcoins.dlc.oracle.config.DLCOracleAppConfig
+import org.bitcoins.dlc.wallet.{DLCAppConfig, DLCDbManagement}
 import org.bitcoins.node.config.NodeAppConfig
 import org.bitcoins.node.db.NodeDbManagement
 import org.bitcoins.testkit.BitcoinSTestAppConfig.ProjectType
@@ -29,6 +30,13 @@ class DbManagementTest extends BitcoinSAsyncTest with EmbeddedPg {
       override def appConfig: ChainAppConfig = chainAppConfig
     }
 
+  def createDLCDbManagement(dlcAppConfig: DLCAppConfig): DLCDbManagement =
+    new DLCDbManagement with JdbcProfileComponent[DLCAppConfig] {
+      override val ec: ExecutionContext = system.dispatcher
+
+      override def appConfig: DLCAppConfig = dlcAppConfig
+    }
+
   def createWalletDbManagement(
       walletAppConfig: WalletAppConfig): WalletDbManagement =
     new WalletDbManagement with JdbcProfileComponent[WalletAppConfig] {
@@ -67,6 +75,29 @@ class DbManagementTest extends BitcoinSAsyncTest with EmbeddedPg {
 
   }
 
+  it must "run migrations for dlc db" in {
+    val dlcAppConfig =
+      DLCAppConfig(BitcoinSTestAppConfig.tmpDir(), dbConfig(ProjectType.DLC))
+    val dlcDbManagement = createDLCDbManagement(dlcAppConfig)
+    val result = dlcDbManagement.migrate()
+    dlcAppConfig.driver match {
+      case SQLite =>
+        val expected = 2
+        assert(result == expected)
+        val flywayInfo = dlcAppConfig.info()
+        assert(flywayInfo.applied().length == expected)
+        assert(flywayInfo.pending().length == 0)
+      case PostgreSQL =>
+        val expected = 2
+        assert(result == expected)
+        val flywayInfo = dlcAppConfig.info()
+
+        //+1 for << Flyway Schema Creation >>
+        assert(flywayInfo.applied().length == expected + 1)
+        assert(flywayInfo.pending().length == 0)
+    }
+  }
+
   it must "run migrations for wallet db" in {
     val walletAppConfig = WalletAppConfig(BitcoinSTestAppConfig.tmpDir(),
                                           dbConfig(ProjectType.Wallet))
diff --git a/db-commons/src/main/resources/reference.conf b/db-commons/src/main/resources/reference.conf
index dc80b1491c..7a11c72251 100644
--- a/db-commons/src/main/resources/reference.conf
+++ b/db-commons/src/main/resources/reference.conf
@@ -111,6 +111,22 @@ bitcoin-s {
         rpcport = 9999
     }
 
+  dlc = ${bitcoin-s.sqlite}
+  dlc {
+    # this config key is read by Slick
+    db {
+      name = dlcdb.sqlite
+      url = "jdbc:sqlite:"${bitcoin-s.dlc.db.path}${bitcoin-s.dlc.db.name}
+    }
+    # PostgreSQL example:
+    # db {
+    #   url = "jdbc:postgresql://localhost:5432/dlc"
+    #   driver = org.postgresql.Driver
+    #   username = postgres
+    #   password = ""
+    # }
+  }
+
   oracle = ${bitcoin-s.sqlite}
   oracle {
     # this config key is read by Slick
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/DLCClientIntegrationTest.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/DLCClientIntegrationTest.scala
new file mode 100644
index 0000000000..893401e17b
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/DLCClientIntegrationTest.scala
@@ -0,0 +1,586 @@
+package org.bitcoins.dlc
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.SingleNonceOracleInfo
+import org.bitcoins.commons.jsonmodels.dlc._
+import org.bitcoins.core.config.RegTest
+import org.bitcoins.core.currency.{
+  Bitcoins,
+  CurrencyUnit,
+  CurrencyUnits,
+  Satoshis
+}
+import org.bitcoins.core.number.{UInt16, UInt32}
+import org.bitcoins.core.protocol.BitcoinAddress
+import org.bitcoins.core.protocol.BlockStamp.BlockHeight
+import org.bitcoins.core.protocol.script._
+import org.bitcoins.core.protocol.transaction.{
+  Transaction,
+  TransactionConstants,
+  TransactionOutPoint
+}
+import org.bitcoins.core.script.crypto.HashType
+import org.bitcoins.core.util.FutureUtil
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.core.wallet.utxo._
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import org.bitcoins.dlc.execution.{
+  DLCOutcome,
+  ExecutedDLCOutcome,
+  RefundDLCOutcome,
+  SetupDLC
+}
+import org.bitcoins.dlc.testgen.{DLCTestUtil, TestDLCClient}
+import org.bitcoins.rpc.BitcoindException
+import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil
+import org.bitcoins.testkit.util.BitcoindRpcTest
+import org.scalatest.Assertion
+
+import scala.concurrent.duration.DurationInt
+import scala.concurrent.{Future, Promise}
+import scala.util.{Failure, Success}
+
+class DLCClientIntegrationTest extends BitcoindRpcTest {
+  private val clientsF = BitcoindRpcTestUtil.createNodePairV18(clientAccum)
+  private val clientF = clientsF.map(_._1)
+  private val addressForMiningF = clientF.flatMap(_.getNewAddress)
+
+  def publishTransaction(tx: Transaction): Future[Transaction] = {
+    for {
+      client <- clientF
+      txid <- client.sendRawTransaction(tx)
+      _ = assert(tx.txIdBE == txid)
+      addressForMining <- addressForMiningF
+      _ <- client.generateToAddress(blocks = 6, addressForMining)
+    } yield tx
+  }
+
+  def waitUntilBlock(blockHeight: Int): Future[Unit] = {
+    for {
+      client <- clientF
+      addressForMining <- addressForMiningF
+      _ <- BitcoindRpcTestUtil.waitUntilBlock(blockHeight,
+                                              client,
+                                              addressForMining)
+    } yield ()
+  }
+
+  behavior of "AdaptorDLCClient"
+
+  val oraclePrivKey: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val oraclePubKey: SchnorrPublicKey = oraclePrivKey.schnorrPublicKey
+  val preCommittedK: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val preCommittedR: SchnorrNonce = preCommittedK.schnorrNonce
+  val localInput: CurrencyUnit = CurrencyUnits.oneBTC
+  val remoteInput: CurrencyUnit = CurrencyUnits.oneBTC
+  val totalInput: CurrencyUnit = localInput + remoteInput
+
+  val inputPrivKeyLocal: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPubKeyLocal: ECPublicKey = inputPrivKeyLocal.publicKey
+  val inputPrivKeyLocal2A: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPrivKeyLocal2B: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPubKeyLocal2A: ECPublicKey = inputPrivKeyLocal2A.publicKey
+  val inputPubKeyLocal2B: ECPublicKey = inputPrivKeyLocal2B.publicKey
+  val inputPrivKeyRemote: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPubKeyRemote: ECPublicKey = inputPrivKeyRemote.publicKey
+  val inputPrivKeyRemote2A: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPrivKeyRemote2B: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPubKeyRemote2A: ECPublicKey = inputPrivKeyRemote2A.publicKey
+  val inputPubKeyRemote2B: ECPublicKey = inputPrivKeyRemote2B.publicKey
+
+  val localAddress: BitcoinAddress =
+    BitcoinAddress.fromScriptPubKey(P2WPKHWitnessSPKV0(inputPubKeyLocal),
+                                    RegTest)
+
+  val localNestedSPK: IfConditionalScriptPubKey =
+    NonStandardIfConditionalScriptPubKey(P2PKScriptPubKey(inputPubKeyLocal2A),
+                                         P2PKScriptPubKey(inputPubKeyLocal2B))
+
+  val localAddress2: BitcoinAddress =
+    BitcoinAddress.fromScriptPubKey(P2WSHWitnessSPKV0(localNestedSPK), RegTest)
+
+  val remoteAddress: BitcoinAddress =
+    BitcoinAddress.fromScriptPubKey(P2WPKHWitnessSPKV0(inputPubKeyRemote),
+                                    RegTest)
+
+  val remoteNestedSPK: MultiSignatureScriptPubKey =
+    MultiSignatureScriptPubKey(2,
+                               Vector(inputPubKeyRemote2A, inputPubKeyRemote2B))
+
+  val remoteAddress2: BitcoinAddress =
+    BitcoinAddress.fromScriptPubKey(
+      P2SHScriptPubKey(P2WSHWitnessSPKV0(remoteNestedSPK)),
+      RegTest)
+
+  val localChangeSPK: P2WPKHWitnessSPKV0 = P2WPKHWitnessSPKV0(
+    ECPublicKey.freshPublicKey)
+
+  val remoteChangeSPK: P2WPKHWitnessSPKV0 = P2WPKHWitnessSPKV0(
+    ECPublicKey.freshPublicKey)
+
+  def constructDLC(numOutcomes: Int): Future[
+    (TestDLCClient, TestDLCClient, Vector[String])] = {
+    def fundingInput(input: CurrencyUnit): Bitcoins = {
+      Bitcoins((input + Satoshis(200)).satoshis)
+    }
+
+    val fundedInputsTxidF = for {
+      client <- clientF
+      transactionWithoutFunds <-
+        client
+          .createRawTransaction(
+            Vector.empty,
+            Map(
+              localAddress -> fundingInput(localInput),
+              localAddress2 -> fundingInput(localInput),
+              remoteAddress -> fundingInput(remoteInput),
+              remoteAddress2 -> fundingInput(remoteInput)
+            )
+          )
+      transactionResult <- client.fundRawTransaction(transactionWithoutFunds)
+      transaction = transactionResult.hex
+      signedTxResult <- client.signRawTransactionWithWallet(transaction)
+      localOutputIndex =
+        signedTxResult.hex.outputs.zipWithIndex
+          .find {
+            case (output, _) =>
+              output.scriptPubKey match {
+                case p2wpkh: P2WPKHWitnessSPKV0 =>
+                  p2wpkh.pubKeyHash == P2WPKHWitnessSPKV0(
+                    inputPubKeyLocal).pubKeyHash
+                case _ => false
+              }
+          }
+          .map(_._2)
+      localOutputIndex2 =
+        signedTxResult.hex.outputs.zipWithIndex
+          .find {
+            case (output, _) =>
+              output.scriptPubKey match {
+                case p2wsh: P2WSHWitnessSPKV0 =>
+                  p2wsh.scriptHash == P2WSHWitnessSPKV0(
+                    localNestedSPK).scriptHash
+                case _ => false
+              }
+          }
+          .map(_._2)
+      remoteOutputIndex =
+        signedTxResult.hex.outputs.zipWithIndex
+          .find {
+            case (output, _) =>
+              output.scriptPubKey match {
+                case p2wpkh: P2WPKHWitnessSPKV0 =>
+                  p2wpkh.pubKeyHash == P2WPKHWitnessSPKV0(
+                    inputPubKeyRemote).pubKeyHash
+                case _ => false
+              }
+          }
+          .map(_._2)
+      remoteOutputIndex2 =
+        signedTxResult.hex.outputs.zipWithIndex
+          .find {
+            case (output, _) =>
+              output.scriptPubKey match {
+                case p2sh: P2SHScriptPubKey =>
+                  p2sh.scriptHash == P2SHScriptPubKey(
+                    P2WSHWitnessSPKV0(remoteNestedSPK)).scriptHash
+                case _ => false
+              }
+          }
+          .map(_._2)
+      tx <- publishTransaction(signedTxResult.hex)
+    } yield {
+      assert(localOutputIndex.isDefined)
+      assert(localOutputIndex2.isDefined)
+      assert(remoteOutputIndex.isDefined)
+      assert(remoteOutputIndex2.isDefined)
+
+      (tx,
+       localOutputIndex.get,
+       localOutputIndex2.get,
+       remoteOutputIndex.get,
+       remoteOutputIndex2.get,
+       signedTxResult.hex)
+    }
+
+    val localFundingUtxosF = fundedInputsTxidF.map {
+      case (prevTx, localOutputIndex, localOutputIndex2, _, _, tx) =>
+        Vector(
+          ScriptSignatureParams(
+            inputInfo = P2WPKHV0InputInfo(
+              outPoint =
+                TransactionOutPoint(prevTx.txIdBE, UInt32(localOutputIndex)),
+              amount = tx.outputs(localOutputIndex).value,
+              pubKey = inputPubKeyLocal
+            ),
+            prevTransaction = prevTx,
+            signer = inputPrivKeyLocal,
+            hashType = HashType.sigHashAll
+          ),
+          ScriptSignatureParams(
+            P2WSHV0InputInfo(
+              outPoint =
+                TransactionOutPoint(prevTx.txIdBE, UInt32(localOutputIndex2)),
+              amount = tx.outputs(localOutputIndex2).value,
+              scriptWitness = P2WSHWitnessV0(localNestedSPK),
+              ConditionalPath.nonNestedTrue
+            ),
+            prevTransaction = prevTx,
+            signer = inputPrivKeyLocal2A,
+            hashType = HashType.sigHashAll
+          )
+        )
+    }
+
+    val remoteFundingUtxosF = fundedInputsTxidF.map {
+      case (prevTx, _, _, remoteOutputIndex, remoteOutputIndex2, tx) =>
+        Vector(
+          ScriptSignatureParams(
+            P2WPKHV0InputInfo(
+              outPoint =
+                TransactionOutPoint(prevTx.txIdBE, UInt32(remoteOutputIndex)),
+              amount = tx.outputs(remoteOutputIndex).value,
+              pubKey = inputPubKeyRemote
+            ),
+            prevTx,
+            inputPrivKeyRemote,
+            HashType.sigHashAll
+          ),
+          ScriptSignatureParams(
+            P2SHNestedSegwitV0InputInfo(
+              outPoint =
+                TransactionOutPoint(prevTx.txIdBE, UInt32(remoteOutputIndex2)),
+              amount = tx.outputs(remoteOutputIndex2).value,
+              scriptWitness = P2WSHWitnessV0(remoteNestedSPK),
+              ConditionalPath.NoCondition
+            ),
+            prevTransaction = prevTx,
+            signers = Vector(inputPrivKeyRemote2A, inputPrivKeyRemote2B),
+            hashType = HashType.sigHashAll
+          )
+        )
+    }
+
+    val feeRateF = clientF
+      .flatMap(_.getNetworkInfo.map(_.relayfee))
+      .map(btc => SatoshisPerVirtualByte(btc.satoshis))
+
+    for {
+      localFundingUtxos <- localFundingUtxosF
+      remoteFundingUtxos <- remoteFundingUtxosF
+      feeRate <- feeRateF
+      client <- clientF
+      currentHeight <- client.getBlockCount
+    } yield {
+      val tomorrowInBlocks = BlockHeight(currentHeight + 144)
+      val twoDaysInBlocks = BlockHeight(currentHeight + 288)
+
+      val localFundingPrivKey = ECPrivateKey.freshPrivateKey
+      val localPayoutPrivKey = ECPrivateKey.freshPrivateKey
+      val remoteFundingPrivKey = ECPrivateKey.freshPrivateKey
+      val remotePayoutPrivKey = ECPrivateKey.freshPrivateKey
+
+      val localFundingInputs = localFundingUtxos.map { utxo =>
+        DLCFundingInput(
+          utxo.prevTransaction,
+          utxo.outPoint.vout,
+          TransactionConstants.sequence,
+          UInt16(utxo.maxWitnessLen),
+          InputInfo
+            .getRedeemScript(utxo.inputInfo)
+            .map(_.asInstanceOf[WitnessScriptPubKey])
+        )
+      }
+      val remoteFundingInputs = remoteFundingUtxos.map { utxo =>
+        DLCFundingInput(
+          utxo.prevTransaction,
+          utxo.outPoint.vout,
+          TransactionConstants.sequence,
+          UInt16(utxo.maxWitnessLen),
+          InputInfo
+            .getRedeemScript(utxo.inputInfo)
+            .map(_.asInstanceOf[WitnessScriptPubKey])
+        )
+      }
+
+      val outcomeStrs = DLCTestUtil.genOutcomes(numOutcomes)
+
+      val (outcomes, otherOutcomes) =
+        DLCTestUtil.genContractInfos(outcomeStrs, totalInput)
+
+      val acceptDLC = TestDLCClient(
+        outcomes = outcomes,
+        oracleInfo = SingleNonceOracleInfo(oraclePubKey, preCommittedR),
+        isInitiator = false,
+        fundingPrivKey = localFundingPrivKey,
+        payoutPrivKey = localPayoutPrivKey,
+        remotePubKeys = DLCPublicKeys.fromPrivKeys(remoteFundingPrivKey,
+                                                   remotePayoutPrivKey,
+                                                   RegTest),
+        input = localInput,
+        remoteInput = remoteInput,
+        fundingUtxos = localFundingUtxos,
+        remoteFundingInputs = remoteFundingInputs,
+        timeouts = DLCTimeouts(tomorrowInBlocks, twoDaysInBlocks),
+        feeRate = feeRate,
+        changeSPK = localChangeSPK,
+        remoteChangeSPK = remoteChangeSPK,
+        network = RegTest
+      )
+
+      val offerDLC = TestDLCClient(
+        outcomes = otherOutcomes,
+        oracleInfo = SingleNonceOracleInfo(oraclePubKey, preCommittedR),
+        isInitiator = true,
+        fundingPrivKey = remoteFundingPrivKey,
+        payoutPrivKey = remotePayoutPrivKey,
+        remotePubKeys = DLCPublicKeys.fromPrivKeys(localFundingPrivKey,
+                                                   localPayoutPrivKey,
+                                                   RegTest),
+        input = remoteInput,
+        remoteInput = localInput,
+        fundingUtxos = remoteFundingUtxos,
+        remoteFundingInputs = localFundingInputs,
+        timeouts = DLCTimeouts(tomorrowInBlocks, twoDaysInBlocks),
+        feeRate = feeRate,
+        changeSPK = remoteChangeSPK,
+        remoteChangeSPK = localChangeSPK,
+        network = RegTest
+      )
+
+      (acceptDLC, offerDLC, outcomeStrs)
+    }
+  }
+
+  def noEmptySPKOutputs(tx: Transaction): Boolean = {
+    tx.outputs.forall(_.scriptPubKey != EmptyScriptPubKey)
+  }
+
+  def validateOutcome(
+      outcome: DLCOutcome,
+      builder: DLCTxBuilder): Future[Assertion] = {
+    val fundingTx = outcome.fundingTx
+    val closingTx = outcome match {
+      case ExecutedDLCOutcome(_, cet, _) => cet
+      case RefundDLCOutcome(_, refundTx) => refundTx
+    }
+
+    for {
+      client <- clientF
+      regtestFundingTx <- client.getRawTransaction(fundingTx.txIdBE)
+      regtestClosingTx <- client.getRawTransaction(closingTx.txIdBE)
+    } yield {
+      DLCFeeTestUtil.validateFees(builder,
+                                  fundingTx,
+                                  closingTx,
+                                  fundingTxSigs = 5)
+      assert(noEmptySPKOutputs(fundingTx))
+      assert(regtestFundingTx.hex == fundingTx)
+      assert(regtestFundingTx.confirmations.isDefined)
+      assert(regtestFundingTx.confirmations.get >= 6)
+
+      assert(noEmptySPKOutputs(closingTx))
+      assert(regtestClosingTx.hex == closingTx)
+      assert(regtestClosingTx.confirmations.isDefined)
+      assert(regtestClosingTx.confirmations.get >= 6)
+    }
+  }
+
+  def setupDLC(
+      dlcAccept: TestDLCClient,
+      dlcOffer: TestDLCClient): Future[(SetupDLC, SetupDLC)] = {
+    val offerSigReceiveP =
+      Promise[CETSignatures]()
+    val sendAcceptSigs = { sigs: CETSignatures =>
+      val _ = offerSigReceiveP.success(sigs)
+      FutureUtil.unit
+    }
+
+    val acceptSigReceiveP =
+      Promise[(CETSignatures, FundingSignatures)]()
+    val sendOfferSigs = {
+      (cetSigs: CETSignatures, fundingSigs: FundingSignatures) =>
+        val _ = acceptSigReceiveP.success(cetSigs, fundingSigs)
+        FutureUtil.unit
+    }
+
+    val acceptSetupF = dlcAccept.setupDLCAccept(sendSigs = sendAcceptSigs,
+                                                getSigs =
+                                                  acceptSigReceiveP.future)
+
+    val fundingTxP = Promise[Transaction]()
+
+    val watchForFundingTx = new Runnable {
+      override def run(): Unit = {
+        if (!fundingTxP.isCompleted) {
+          clientF.foreach { client =>
+            val fundingTxResultF =
+              client.getRawTransaction(dlcOffer.fundingTxIdBE)
+
+            fundingTxResultF.onComplete {
+              case Success(fundingTxResult) =>
+                if (
+                  fundingTxResult.confirmations.isEmpty || fundingTxResult.confirmations.get < 3
+                ) {
+                  ()
+                } else {
+                  fundingTxP.trySuccess(fundingTxResult.hex)
+                }
+              case Failure(_) => ()
+            }
+          }
+        }
+      }
+    }
+
+    val cancelOnFundingFound =
+      system.scheduler.scheduleWithFixedDelay(
+        initialDelay = 100.milliseconds,
+        delay = 1.second)(runnable = watchForFundingTx)
+
+    fundingTxP.future.foreach(_ => cancelOnFundingFound.cancel())
+
+    val offerSetupF = dlcOffer.setupDLCOffer(getSigs = offerSigReceiveP.future,
+                                             sendSigs = sendOfferSigs,
+                                             getFundingTx = fundingTxP.future)
+
+    for {
+      acceptSetup <- acceptSetupF
+      _ <- publishTransaction(acceptSetup.fundingTx)
+      offerSetup <- offerSetupF
+    } yield {
+      assert(acceptSetup.fundingTx == offerSetup.fundingTx)
+      assert(acceptSetup.refundTx == offerSetup.refundTx)
+      acceptSetup.cets.foreach {
+        case (msg, cetInfo) =>
+          assert(cetInfo.tx == offerSetup.cets(msg).tx)
+      }
+
+      (acceptSetup, offerSetup)
+    }
+  }
+
+  def constructAndSetupDLC(numOutcomes: Int): Future[
+    (TestDLCClient, SetupDLC, TestDLCClient, SetupDLC, Vector[String])] = {
+    for {
+      (acceptDLC, offerDLC, outcomes) <- constructDLC(numOutcomes)
+      (acceptSetup, offerSetup) <- setupDLC(acceptDLC, offerDLC)
+    } yield (acceptDLC, acceptSetup, offerDLC, offerSetup, outcomes)
+  }
+
+  def executeForCase(
+      outcomeIndex: Int,
+      numOutcomes: Int,
+      local: Boolean): Future[Assertion] = {
+    for {
+      (acceptDLC, acceptSetup, offerDLC, offerSetup, outcomes) <-
+        constructAndSetupDLC(numOutcomes)
+
+      oracleSig = oraclePrivKey.schnorrSignWithNonce(
+        CryptoUtil.sha256(outcomes(outcomeIndex)).bytes,
+        preCommittedK)
+
+      (unilateralDLC, unilateralSetup, otherDLC, otherSetup) = {
+        if (local) {
+          (offerDLC, offerSetup, acceptDLC, acceptSetup)
+        } else {
+          (acceptDLC, acceptSetup, offerDLC, offerSetup)
+        }
+      }
+
+      unilateralOutcome <- unilateralDLC.executeDLC(
+        unilateralSetup,
+        Future.successful(Vector(oracleSig)))
+      otherOutcome <-
+        otherDLC.executeDLC(otherSetup, Future.successful(Vector(oracleSig)))
+
+      _ <- recoverToSucceededIf[BitcoindException](
+        publishTransaction(unilateralOutcome.cet))
+      _ <- waitUntilBlock(
+        unilateralDLC.timeouts.contractMaturity.toUInt32.toInt - 1)
+      _ <- recoverToSucceededIf[BitcoindException](
+        publishTransaction(unilateralOutcome.cet))
+      _ <- waitUntilBlock(
+        unilateralDLC.timeouts.contractMaturity.toUInt32.toInt)
+      _ <- publishTransaction(unilateralOutcome.cet)
+      _ <- validateOutcome(unilateralOutcome, offerDLC.dlcTxBuilder)
+    } yield {
+      assert(unilateralOutcome.fundingTx == otherOutcome.fundingTx)
+      assert(unilateralOutcome.cet.txIdBE == otherOutcome.cet.txIdBE)
+    }
+  }
+
+  def executeForRefundCase(numOutcomes: Int): Future[Assertion] = {
+    for {
+      (acceptDLC, acceptSetup, offerDLC, offerSetup, _) <- constructAndSetupDLC(
+        numOutcomes)
+
+      acceptOutcome = acceptDLC.executeRefundDLC(acceptSetup)
+      offerOutcome = offerDLC.executeRefundDLC(offerSetup)
+
+      _ = assert(offerOutcome.refundTx == acceptOutcome.refundTx)
+      refundTx = offerOutcome.refundTx
+      _ = assert(acceptDLC.timeouts == offerDLC.timeouts)
+      timeout = offerDLC.timeouts.contractTimeout.toUInt32.toInt
+      _ <- recoverToSucceededIf[BitcoindException](publishTransaction(refundTx))
+      _ <- waitUntilBlock(timeout - 1)
+      _ <- recoverToSucceededIf[BitcoindException](publishTransaction(refundTx))
+      _ <- waitUntilBlock(timeout)
+      _ <- publishTransaction(refundTx)
+      _ <- validateOutcome(offerOutcome, offerDLC.dlcTxBuilder)
+      _ <- validateOutcome(acceptOutcome, acceptDLC.dlcTxBuilder)
+    } yield {
+      assert(acceptOutcome.fundingTx == offerOutcome.fundingTx)
+    }
+  }
+
+  val numOutcomesToTest: Vector[Int] = Vector(2, 8, 100)
+
+  def indicesToTest(numOutcomes: Int): Vector[Int] = {
+    if (numOutcomes == 2) {
+      Vector(0, 1)
+    } else {
+      Vector(0, numOutcomes / 2, numOutcomes - 1)
+    }
+  }
+
+  def runTests(
+      exec: (Int, Int, Boolean) => Future[Assertion],
+      local: Boolean): Future[Assertion] = {
+    val testFs = numOutcomesToTest.flatMap { numOutcomes =>
+      indicesToTest(numOutcomes).map { outcomeIndex => () =>
+        exec(outcomeIndex, numOutcomes, local)
+      }
+    }
+
+    testFs.foldLeft(Future.successful(succeed)) {
+      case (resultF, testExec) =>
+        resultF.flatMap { _ =>
+          testExec()
+        }
+    }
+  }
+
+  it should "be able to publish all DLC txs to Regtest for the normal local case" in {
+    runTests(executeForCase, local = true)
+  }
+
+  it should "be able to publish all DLC txs to Regtest for the normal remote case" in {
+    runTests(executeForCase, local = false)
+  }
+
+  it should "be able to publish all DLC txs to Regtest for the Refund case" in {
+    val testFs = numOutcomesToTest.map { numOutcomes => () =>
+      for {
+        _ <- executeForRefundCase(numOutcomes)
+      } yield succeed
+    }
+
+    testFs.foldLeft(Future.successful(succeed)) {
+      case (resultF, testExec) =>
+        resultF.flatMap { _ =>
+          testExec()
+        }
+    }
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/DLCClientTest.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/DLCClientTest.scala
new file mode 100644
index 0000000000..772c4affaf
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/DLCClientTest.scala
@@ -0,0 +1,722 @@
+package org.bitcoins.dlc
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.{
+  DLCSign,
+  MultiNonceContractInfo,
+  MultiNonceOracleInfo,
+  SingleNonceOracleInfo
+}
+import org.bitcoins.commons.jsonmodels.dlc._
+import org.bitcoins.core.config.RegTest
+import org.bitcoins.core.currency.{CurrencyUnit, CurrencyUnits, Satoshis}
+import org.bitcoins.core.number.{UInt16, UInt32}
+import org.bitcoins.core.protocol.BlockStamp.BlockTime
+import org.bitcoins.core.protocol.script._
+import org.bitcoins.core.protocol.tlv.{
+  DLCOutcomeType,
+  EnumOutcome,
+  UnsignedNumericOutcome
+}
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.script.crypto.HashType
+import org.bitcoins.core.util.{BitcoinScriptUtil, FutureUtil, NumberUtil}
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.core.wallet.utxo._
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import org.bitcoins.dlc.execution._
+import org.bitcoins.dlc.testgen.{DLCTestUtil, TestDLCClient}
+import org.bitcoins.dlc.verify.DLCSignatureVerifier
+import org.bitcoins.testkit.util.BitcoinSAsyncTest
+import org.scalatest.Assertion
+
+import scala.concurrent.{Future, Promise}
+
+class DLCClientTest extends BitcoinSAsyncTest {
+  behavior of "AdaptorDLCClient"
+
+  val oraclePrivKey: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val oraclePubKey: SchnorrPublicKey = oraclePrivKey.schnorrPublicKey
+
+  val preCommittedKs: Vector[ECPrivateKey] =
+    (0 until 100).toVector.map(_ => ECPrivateKey.freshPrivateKey)
+  val preCommittedRs: Vector[SchnorrNonce] = preCommittedKs.map(_.schnorrNonce)
+  val preCommittedK: ECPrivateKey = preCommittedKs.head
+  val preCommittedR: SchnorrNonce = preCommittedRs.head
+
+  val localInput: CurrencyUnit = CurrencyUnits.oneBTC
+  val remoteInput: CurrencyUnit = CurrencyUnits.oneBTC
+  val totalInput: CurrencyUnit = localInput + remoteInput
+
+  val inputPrivKeyLocal: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPubKeyLocal: ECPublicKey = inputPrivKeyLocal.publicKey
+  val inputPrivKeyLocal2A: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPrivKeyLocal2B: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPubKeyLocal2A: ECPublicKey = inputPrivKeyLocal2A.publicKey
+  val inputPubKeyLocal2B: ECPublicKey = inputPrivKeyLocal2B.publicKey
+  val inputPrivKeyRemote: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPubKeyRemote: ECPublicKey = inputPrivKeyRemote.publicKey
+  val inputPrivKeyRemote2A: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPrivKeyRemote2B: ECPrivateKey = ECPrivateKey.freshPrivateKey
+  val inputPubKeyRemote2A: ECPublicKey = inputPrivKeyRemote2A.publicKey
+  val inputPubKeyRemote2B: ECPublicKey = inputPrivKeyRemote2B.publicKey
+
+  val blockTimeToday: BlockTime = BlockTime(
+    UInt32(System.currentTimeMillis() / 1000))
+
+  val localFundingTx: Transaction = BaseTransaction(
+    TransactionConstants.validLockVersion,
+    Vector.empty,
+    Vector(
+      TransactionOutput(localInput,
+                        P2WPKHWitnessSPKV0(inputPrivKeyLocal.publicKey))),
+    UInt32.zero
+  )
+
+  val localNestedSPK: IfConditionalScriptPubKey =
+    NonStandardIfConditionalScriptPubKey(P2PKScriptPubKey(inputPubKeyLocal2A),
+                                         P2PKScriptPubKey(inputPubKeyLocal2B))
+
+  val localFundingTx2: Transaction = BaseTransaction(
+    TransactionConstants.validLockVersion,
+    Vector.empty,
+    Vector(TransactionOutput(localInput, P2WSHWitnessSPKV0(localNestedSPK))),
+    UInt32.zero
+  )
+
+  val localFundingUtxos = Vector(
+    ScriptSignatureParams(
+      P2WPKHV0InputInfo(outPoint =
+                          TransactionOutPoint(localFundingTx.txId, UInt32.zero),
+                        amount = localInput,
+                        pubKey = inputPubKeyLocal),
+      prevTransaction = localFundingTx,
+      signer = inputPrivKeyLocal,
+      hashType = HashType.sigHashAll
+    ),
+    ScriptSignatureParams(
+      P2WSHV0InputInfo(
+        outPoint = TransactionOutPoint(localFundingTx2.txId, UInt32.zero),
+        amount = localInput,
+        scriptWitness = P2WSHWitnessV0(localNestedSPK),
+        ConditionalPath.nonNestedTrue
+      ),
+      prevTransaction = localFundingTx2,
+      signer = inputPrivKeyLocal2A,
+      hashType = HashType.sigHashAll
+    )
+  )
+
+  val localFundingInputs: Vector[DLCFundingInput] =
+    Vector(
+      DLCFundingInputP2WPKHV0(localFundingTx,
+                              UInt32.zero,
+                              TransactionConstants.sequence),
+      DLCFundingInputP2WSHV0(localFundingTx2,
+                             UInt32.zero,
+                             TransactionConstants.sequence,
+                             maxWitnessLen =
+                               UInt16(localFundingUtxos.last.maxWitnessLen))
+    )
+
+  val remoteFundingTx: Transaction = BaseTransaction(
+    TransactionConstants.validLockVersion,
+    Vector.empty,
+    Vector(
+      TransactionOutput(remoteInput,
+                        P2WPKHWitnessSPKV0(inputPrivKeyRemote.publicKey))),
+    UInt32.zero
+  )
+
+  val remoteNestedSPK: MultiSignatureScriptPubKey =
+    MultiSignatureScriptPubKey(2,
+                               Vector(inputPubKeyRemote2A, inputPubKeyRemote2B))
+
+  val remoteFundingTx2: Transaction = BaseTransaction(
+    TransactionConstants.validLockVersion,
+    Vector.empty,
+    Vector(
+      TransactionOutput(remoteInput,
+                        P2SHScriptPubKey(P2WSHWitnessSPKV0(remoteNestedSPK)))),
+    UInt32.zero
+  )
+
+  val remoteFundingUtxos = Vector(
+    ScriptSignatureParams(
+      P2WPKHV0InputInfo(outPoint = TransactionOutPoint(remoteFundingTx.txId,
+                                                       UInt32.zero),
+                        amount = remoteInput,
+                        pubKey = inputPubKeyRemote),
+      prevTransaction = remoteFundingTx,
+      signer = inputPrivKeyRemote,
+      hashType = HashType.sigHashAll
+    ),
+    ScriptSignatureParams(
+      P2SHNestedSegwitV0InputInfo(
+        outPoint = TransactionOutPoint(remoteFundingTx2.txId, UInt32.zero),
+        amount = remoteInput,
+        scriptWitness = P2WSHWitnessV0(remoteNestedSPK),
+        ConditionalPath.NoCondition
+      ),
+      prevTransaction = remoteFundingTx2,
+      signers = Vector(inputPrivKeyRemote2A, inputPrivKeyRemote2B),
+      hashType = HashType.sigHashAll
+    )
+  )
+
+  val remoteFundingInputs: Vector[DLCFundingInput] =
+    Vector(
+      DLCFundingInputP2WPKHV0(remoteFundingTx,
+                              UInt32.zero,
+                              TransactionConstants.sequence),
+      DLCFundingInputP2SHSegwit(
+        prevTx = remoteFundingTx2,
+        prevTxVout = UInt32.zero,
+        sequence = TransactionConstants.sequence,
+        maxWitnessLen = UInt16(remoteFundingUtxos.last.maxWitnessLen),
+        redeemScript = P2WSHWitnessSPKV0(remoteNestedSPK)
+      )
+    )
+
+  val localChangeSPK: P2WPKHWitnessSPKV0 = P2WPKHWitnessSPKV0(
+    ECPublicKey.freshPublicKey)
+
+  val remoteChangeSPK: P2WPKHWitnessSPKV0 = P2WPKHWitnessSPKV0(
+    ECPublicKey.freshPublicKey)
+
+  val offerFundingPrivKey: ECPrivateKey = ECPrivateKey.freshPrivateKey
+
+  val offerPayoutPrivKey: ECPrivateKey = ECPrivateKey.freshPrivateKey
+
+  val acceptFundingPrivKey: ECPrivateKey = ECPrivateKey.freshPrivateKey
+
+  val acceptPayoutPrivKey: ECPrivateKey = ECPrivateKey.freshPrivateKey
+
+  val timeouts: DLCTimeouts =
+    DLCTimeouts(blockTimeToday,
+                BlockTime(UInt32(blockTimeToday.time.toLong + 1)))
+
+  val feeRate: SatoshisPerVirtualByte = SatoshisPerVirtualByte(Satoshis(10))
+
+  def constructDLCClients(numOutcomes: Int, isMultiNonce: Boolean): (
+      TestDLCClient,
+      TestDLCClient,
+      Vector[DLCOutcomeType]) = {
+    val (outcomes, remoteOutcomes, strsOrDigits) = if (!isMultiNonce) {
+      val outcomeStrs = DLCTestUtil.genOutcomes(numOutcomes)
+
+      val (local, remote) =
+        DLCTestUtil.genContractInfos(outcomeStrs, totalInput)
+      (local, remote, outcomeStrs.map(EnumOutcome.apply))
+    } else {
+      val (local, remote) =
+        DLCTestUtil.genMultiDigitContractInfo(numOutcomes, totalInput)
+      (local, remote, local.allOutcomes)
+    }
+
+    val oracleInfo = if (!isMultiNonce) {
+      SingleNonceOracleInfo(oraclePubKey, preCommittedR)
+    } else {
+      MultiNonceOracleInfo(oraclePubKey, preCommittedRs.take(numOutcomes))
+    }
+
+    // Offer is local
+    val dlcOffer: TestDLCClient = TestDLCClient(
+      outcomes = outcomes,
+      oracleInfo = oracleInfo,
+      isInitiator = true,
+      fundingPrivKey = offerFundingPrivKey,
+      payoutPrivKey = offerPayoutPrivKey,
+      remotePubKeys = DLCPublicKeys.fromPrivKeys(acceptFundingPrivKey,
+                                                 acceptPayoutPrivKey,
+                                                 RegTest),
+      input = localInput,
+      remoteInput = remoteInput,
+      fundingUtxos = localFundingUtxos,
+      remoteFundingInputs = remoteFundingInputs,
+      timeouts = timeouts,
+      feeRate = feeRate,
+      changeSPK = localChangeSPK,
+      remoteChangeSPK = remoteChangeSPK,
+      network = RegTest
+    )
+
+    // Accept is remote
+    val dlcAccept: TestDLCClient = TestDLCClient(
+      outcomes = remoteOutcomes,
+      oracleInfo = oracleInfo,
+      isInitiator = false,
+      fundingPrivKey = acceptFundingPrivKey,
+      payoutPrivKey = acceptPayoutPrivKey,
+      remotePubKeys = DLCPublicKeys.fromPrivKeys(offerFundingPrivKey,
+                                                 offerPayoutPrivKey,
+                                                 RegTest),
+      input = remoteInput,
+      remoteInput = localInput,
+      fundingUtxos = remoteFundingUtxos,
+      remoteFundingInputs = localFundingInputs,
+      timeouts = timeouts,
+      feeRate = feeRate,
+      changeSPK = remoteChangeSPK,
+      remoteChangeSPK = localChangeSPK,
+      network = RegTest
+    )
+
+    (dlcOffer, dlcAccept, strsOrDigits)
+  }
+
+  def noEmptySPKOutputs(tx: Transaction): Boolean = {
+    tx.outputs.forall(_.scriptPubKey != EmptyScriptPubKey)
+  }
+
+  def validateOutcome(
+      outcome: DLCOutcome,
+      dlcOffer: TestDLCClient,
+      dlcAccept: TestDLCClient): Assertion = {
+    val fundingTx = outcome.fundingTx
+    assert(noEmptySPKOutputs(fundingTx))
+
+    val signers = Vector(dlcOffer.fundingPrivKey, dlcAccept.fundingPrivKey)
+    val closingSpendingInfo = ScriptSignatureParams(
+      P2WSHV0InputInfo(
+        TransactionOutPoint(fundingTx.txId, UInt32.zero),
+        fundingTx.outputs.head.value,
+        P2WSHWitnessV0(
+          MultiSignatureScriptPubKey(2,
+                                     signers.map(_.publicKey).sortBy(_.hex))),
+        ConditionalPath.NoCondition
+      ),
+      fundingTx,
+      signers,
+      HashType.sigHashAll
+    )
+
+    outcome match {
+      case ExecutedDLCOutcome(fundingTx, cet, _) =>
+        DLCFeeTestUtil.validateFees(dlcOffer.dlcTxBuilder,
+                                    fundingTx,
+                                    cet,
+                                    fundingTxSigs = 5)
+        assert(noEmptySPKOutputs(cet))
+        assert(BitcoinScriptUtil.verifyScript(cet, Vector(closingSpendingInfo)))
+      case RefundDLCOutcome(fundingTx, refundTx) =>
+        DLCFeeTestUtil.validateFees(dlcOffer.dlcTxBuilder,
+                                    fundingTx,
+                                    refundTx,
+                                    fundingTxSigs = 5)
+        assert(noEmptySPKOutputs(refundTx))
+        assert(
+          BitcoinScriptUtil.verifyScript(refundTx, Vector(closingSpendingInfo)))
+    }
+  }
+
+  def setupDLC(numOutcomes: Int, isMultiDigit: Boolean): Future[
+    (
+        SetupDLC,
+        TestDLCClient,
+        SetupDLC,
+        TestDLCClient,
+        Vector[DLCOutcomeType])] = {
+
+    val (dlcOffer, dlcAccept, outcomeStrs) =
+      constructDLCClients(numOutcomes, isMultiDigit)
+
+    val offerSigReceiveP =
+      Promise[CETSignatures]()
+    val sendAcceptSigs = { sigs: CETSignatures =>
+      val _ = offerSigReceiveP.success(sigs)
+      FutureUtil.unit
+    }
+
+    val acceptSigReceiveP =
+      Promise[(CETSignatures, FundingSignatures)]()
+    val sendOfferSigs = {
+      (cetSigs: CETSignatures, fundingSigs: FundingSignatures) =>
+        val _ = acceptSigReceiveP.success(cetSigs, fundingSigs)
+        FutureUtil.unit
+    }
+
+    val acceptSetupF = dlcAccept.setupDLCAccept(sendSigs = sendAcceptSigs,
+                                                getSigs =
+                                                  acceptSigReceiveP.future)
+    val offerSetupF = dlcOffer.setupDLCOffer(getSigs = offerSigReceiveP.future,
+                                             sendSigs = sendOfferSigs,
+                                             getFundingTx =
+                                               acceptSetupF.map(_.fundingTx))
+
+    for {
+      acceptSetup <- acceptSetupF
+      offerSetup <- offerSetupF
+    } yield {
+      assert(acceptSetup.fundingTx == offerSetup.fundingTx)
+      acceptSetup.cets.foreach {
+        case (outcome, CETInfo(cet, _)) =>
+          assert(cet == offerSetup.cets(outcome).tx)
+      }
+      assert(acceptSetup.refundTx == offerSetup.refundTx)
+
+      (acceptSetup, dlcAccept, offerSetup, dlcOffer, outcomeStrs)
+    }
+  }
+
+  def executeForCase(
+      outcomeIndex: Long,
+      numOutcomes: Int,
+      isMultiDigit: Boolean): Future[Assertion] = {
+    setupDLC(numOutcomes, isMultiDigit).flatMap {
+      case (acceptSetup, dlcAccept, offerSetup, dlcOffer, outcomes) =>
+        val oracleSigs = if (!isMultiDigit) {
+          outcomes(outcomeIndex.toInt) match {
+            case EnumOutcome(outcome) =>
+              val sig = oraclePrivKey.schnorrSignWithNonce(
+                CryptoUtil.sha256(outcome).bytes,
+                preCommittedK)
+              Vector(sig)
+            case UnsignedNumericOutcome(_) => fail("Expected EnumOutcome")
+          }
+        } else {
+          val points =
+            dlcOffer.dlcTxBuilder.oracleAndContractInfo.offerContractInfo
+              .asInstanceOf[MultiNonceContractInfo]
+              .outcomeValueFunc
+              .points
+          val left = points(1).outcome.toLongExact
+          val right = points(2).outcome.toLongExact
+          // Somewhere in the middle third of the interesting values
+          val outcomeNum =
+            (2 * left + right) / 3 + (outcomeIndex % (right - left) / 3)
+
+          val fullDigits =
+            NumberUtil.decompose(outcomeNum, base = 10, numOutcomes)
+
+          val digits =
+            CETCalculator.searchForNumericOutcome(fullDigits, outcomes) match {
+              case Some(UnsignedNumericOutcome(digits)) => digits
+              case None                                 => fail(s"Couldn't find outcome for $outcomeIndex")
+            }
+
+          digits.zip(preCommittedKs.take(digits.length)).map {
+            case (digit, kValue) =>
+              oraclePrivKey.schnorrSignWithNonce(
+                CryptoUtil.sha256(digit.toString).bytes,
+                kValue)
+          }
+        }
+
+        for {
+          offerOutcome <-
+            dlcOffer.executeDLC(offerSetup, Future.successful(oracleSigs))
+          acceptOutcome <-
+            dlcAccept.executeDLC(acceptSetup, Future.successful(oracleSigs))
+        } yield {
+          assert(offerOutcome.fundingTx == acceptOutcome.fundingTx)
+
+          validateOutcome(offerOutcome, dlcOffer, dlcAccept)
+          validateOutcome(acceptOutcome, dlcOffer, dlcAccept)
+        }
+    }
+  }
+
+  def executeRefundCase(
+      numOutcomes: Int,
+      isMultiNonce: Boolean): Future[Assertion] = {
+    setupDLC(numOutcomes, isMultiNonce).flatMap {
+      case (acceptSetup, dlcAccept, offerSetup, dlcOffer, _) =>
+        val offerOutcome = dlcOffer.executeRefundDLC(offerSetup)
+        val acceptOutcome = dlcAccept.executeRefundDLC(acceptSetup)
+
+        validateOutcome(offerOutcome, dlcOffer, dlcAccept)
+        validateOutcome(acceptOutcome, dlcOffer, dlcAccept)
+
+        assert(acceptOutcome.fundingTx == offerOutcome.fundingTx)
+        assert(acceptOutcome.refundTx == offerOutcome.refundTx)
+    }
+  }
+
+  def runTestsForParam[T](paramsToTest: Vector[T])(
+      test: T => Future[Assertion]): Future[Assertion] = {
+    paramsToTest.foldLeft(Future.successful(succeed)) {
+      case (fut, param) =>
+        fut.flatMap { _ =>
+          test(param)
+        }
+    }
+  }
+
+  val numEnumOutcomesToTest: Vector[Int] = Vector(2, 3, 5, 8)
+
+  def runSingleNonceTests(
+      exec: (Long, Int, Boolean) => Future[Assertion]): Future[Assertion] = {
+    runTestsForParam(numEnumOutcomesToTest) { numOutcomes =>
+      runTestsForParam(0.until(numOutcomes).toVector) { outcomeIndex =>
+        exec(outcomeIndex, numOutcomes, false)
+      }
+    }
+  }
+
+  val numDigitsToTest: Vector[Int] = Vector(2, 3, 5)
+
+  def runMultiNonceTests(
+      exec: (Long, Int, Boolean) => Future[Assertion]): Future[Assertion] = {
+    runTestsForParam(numDigitsToTest) { numDigits =>
+      val randDigits = (0 until numDigits).toVector.map { _ =>
+        scala.util.Random.nextInt(10)
+      }
+      val num = randDigits.mkString("").toLong
+
+      exec(num, numDigits, true)
+    }
+  }
+
+  it should "be able to construct and verify with ScriptInterpreter every tx in a DLC for the normal enum case" in {
+    runSingleNonceTests(executeForCase)
+  }
+
+  it should "be able to construct and verify with ScriptInterpreter every tx in a DLC for the normal numeric case" in {
+    runMultiNonceTests(executeForCase)
+  }
+
+  it should "be able to construct and verify with ScriptInterpreter every tx in a DLC for the large numeric case" in {
+    val numDigits = 8
+
+    val randDigits = (0 until numDigits).toVector.map { _ =>
+      scala.util.Random.nextInt(10)
+    }
+    val num = randDigits.mkString("").toLong
+
+    executeForCase(num, numDigits, isMultiDigit = true)
+  }
+
+  it should "be able to construct and verify with ScriptInterpreter every tx in a DLC for the refund case" in {
+    val testFs = numEnumOutcomesToTest.map { numOutcomes =>
+      executeRefundCase(numOutcomes, isMultiNonce = false).flatMap { _ =>
+        executeRefundCase(numOutcomes, isMultiNonce = true)
+      }
+    }
+
+    Future.sequence(testFs).map(_ => succeed)
+  }
+
+  it should "all work for a 100 outcome DLC" in {
+    val numOutcomes = 100
+    val testFs = (0 until 10).map(_ * 10).map { outcomeIndex =>
+      for {
+        _ <- executeForCase(outcomeIndex, numOutcomes, isMultiDigit = false)
+      } yield succeed
+    }
+
+    Future
+      .sequence(testFs)
+      .flatMap(_ => executeRefundCase(numOutcomes, isMultiNonce = false))
+  }
+
+  it should "fail on invalid funding signatures" in {
+    val (offerClient, acceptClient, _) =
+      constructDLCClients(numOutcomes = 3, isMultiNonce = false)
+    val builder = offerClient.dlcTxBuilder
+    val offerVerifier = DLCSignatureVerifier(builder, isInitiator = true)
+    val acceptVerifier = DLCSignatureVerifier(builder, isInitiator = false)
+
+    for {
+      offerFundingSigs <- offerClient.dlcTxSigner.createFundingTxSigs()
+      acceptFundingSigs <- acceptClient.dlcTxSigner.createFundingTxSigs()
+
+      badOfferFundingSigs = DLCTestUtil.flipBit(offerFundingSigs)
+      badAcceptFundingSigs = DLCTestUtil.flipBit(acceptFundingSigs)
+
+      _ <- recoverToSucceededIf[RuntimeException] {
+        offerClient.dlcTxSigner.signFundingTx(badAcceptFundingSigs)
+      }
+      _ <- recoverToSucceededIf[RuntimeException] {
+        acceptClient.dlcTxSigner.signFundingTx(badOfferFundingSigs)
+      }
+    } yield {
+      assert(offerVerifier.verifyRemoteFundingSigs(acceptFundingSigs))
+      assert(acceptVerifier.verifyRemoteFundingSigs(offerFundingSigs))
+
+      assert(!offerVerifier.verifyRemoteFundingSigs(badAcceptFundingSigs))
+      assert(!acceptVerifier.verifyRemoteFundingSigs(badOfferFundingSigs))
+      assert(!offerVerifier.verifyRemoteFundingSigs(offerFundingSigs))
+      assert(!acceptVerifier.verifyRemoteFundingSigs(acceptFundingSigs))
+    }
+  }
+
+  it should "fail on invalid CET signatures" in {
+    val (offerClient, acceptClient, outcomes) =
+      constructDLCClients(numOutcomes = 3, isMultiNonce = false)
+    val builder = offerClient.dlcTxBuilder
+    val offerVerifier = DLCSignatureVerifier(builder, isInitiator = true)
+    val acceptVerifier = DLCSignatureVerifier(builder, isInitiator = false)
+
+    for {
+      offerCETSigs <- offerClient.dlcTxSigner.createCETSigs()
+      acceptCETSigs <- acceptClient.dlcTxSigner.createCETSigs()
+
+      badOfferCETSigs = DLCTestUtil.flipBit(offerCETSigs)
+      badAcceptCETSigs = DLCTestUtil.flipBit(acceptCETSigs)
+
+      cetFailures = outcomes.map { outcome =>
+        val oracleSig =
+          oraclePrivKey.schnorrSignWithNonce(
+            CryptoUtil.sha256(outcome.asInstanceOf[EnumOutcome].outcome).bytes,
+            preCommittedK)
+
+        for {
+          _ <- recoverToSucceededIf[RuntimeException] {
+            offerClient.dlcTxSigner.signCET(outcome,
+                                            badAcceptCETSigs(outcome),
+                                            Vector(oracleSig))
+          }
+          _ <- recoverToSucceededIf[RuntimeException] {
+            acceptClient.dlcTxSigner
+              .signCET(outcome, badOfferCETSigs(outcome), Vector(oracleSig))
+          }
+        } yield succeed
+      }
+
+      _ <- Future.sequence(cetFailures)
+
+      _ <- recoverToExceptionIf[RuntimeException] {
+        offerClient.dlcTxSigner.signRefundTx(badAcceptCETSigs.refundSig)
+      }
+      _ <- recoverToExceptionIf[RuntimeException] {
+        acceptClient.dlcTxSigner.signRefundTx(badOfferCETSigs.refundSig)
+      }
+    } yield {
+      outcomes.foreach { outcome =>
+        assert(offerVerifier.verifyCETSig(outcome, acceptCETSigs(outcome)))
+        assert(acceptVerifier.verifyCETSig(outcome, offerCETSigs(outcome)))
+      }
+      assert(offerVerifier.verifyRefundSig(acceptCETSigs.refundSig))
+      assert(offerVerifier.verifyRefundSig(offerCETSigs.refundSig))
+      assert(acceptVerifier.verifyRefundSig(offerCETSigs.refundSig))
+      assert(acceptVerifier.verifyRefundSig(acceptCETSigs.refundSig))
+
+      outcomes.foreach { outcome =>
+        assert(!offerVerifier.verifyCETSig(outcome, badAcceptCETSigs(outcome)))
+        assert(!acceptVerifier.verifyCETSig(outcome, badOfferCETSigs(outcome)))
+
+        assert(!offerVerifier.verifyCETSig(outcome, offerCETSigs(outcome)))
+        assert(!acceptVerifier.verifyCETSig(outcome, acceptCETSigs(outcome)))
+      }
+      assert(!offerVerifier.verifyRefundSig(badAcceptCETSigs.refundSig))
+      assert(!offerVerifier.verifyRefundSig(badOfferCETSigs.refundSig))
+      assert(!acceptVerifier.verifyRefundSig(badOfferCETSigs.refundSig))
+      assert(!acceptVerifier.verifyRefundSig(badAcceptCETSigs.refundSig))
+    }
+  }
+
+  def assertCorrectSigDerivation(
+      offerSetup: SetupDLC,
+      dlcOffer: TestDLCClient,
+      acceptSetup: SetupDLC,
+      dlcAccept: TestDLCClient,
+      oracleSigs: Vector[SchnorrDigitalSignature],
+      outcome: DLCOutcomeType): Future[Assertion] = {
+    val (aggR, aggS) = oracleSigs
+      .map(sig => (sig.rx.publicKey, sig.sig))
+      .reduce[(ECPublicKey, FieldElement)] {
+        case ((pk1, s1), (pk2, s2)) =>
+          (pk1.add(pk2), s1.add(s2))
+      }
+
+    val aggSig = SchnorrDigitalSignature(aggR.schnorrNonce, aggS)
+
+    for {
+      acceptCETSigs <- dlcAccept.dlcTxSigner.createCETSigs()
+      offerCETSigs <- dlcOffer.dlcTxSigner.createCETSigs()
+      offerFundingSigs <- dlcOffer.dlcTxSigner.createFundingTxSigs()
+      offerOutcome <-
+        dlcOffer.executeDLC(offerSetup, Future.successful(oracleSigs))
+      acceptOutcome <-
+        dlcAccept.executeDLC(acceptSetup, Future.successful(oracleSigs))
+
+      builder = DLCTxBuilder(dlcOffer.offer, dlcAccept.accept)
+      contractId <- builder.buildFundingTx.map(
+        _.txIdBE.bytes.xor(dlcAccept.accept.tempContractId.bytes))
+    } yield {
+      val offer = dlcOffer.offer
+      val accept = dlcOffer.accept.withSigs(acceptCETSigs)
+      val sign = DLCSign(offerCETSigs, offerFundingSigs, contractId)
+
+      val (offerOracleSig, offerDLCOutcome) =
+        DLCStatus.calculateOutcomeAndSig(isInitiator = true,
+                                         offer,
+                                         accept,
+                                         sign,
+                                         acceptOutcome.cet)
+
+      val (acceptOracleSig, acceptDLCOutcome) =
+        DLCStatus.calculateOutcomeAndSig(isInitiator = false,
+                                         offer,
+                                         accept,
+                                         sign,
+                                         offerOutcome.cet)
+
+      assert(offerOracleSig == aggSig)
+      assert(offerDLCOutcome == outcome)
+      assert(acceptOracleSig == aggSig)
+      assert(acceptDLCOutcome == outcome)
+    }
+  }
+
+  it should "be able to derive oracle signature from remote CET signature" in {
+    val outcomeIndex = 1
+
+    runTestsForParam(numEnumOutcomesToTest) { numOutcomes =>
+      setupDLC(numOutcomes, isMultiDigit = false).flatMap {
+        case (acceptSetup, dlcAccept, offerSetup, dlcOffer, outcomes) =>
+          val outcome = outcomes(outcomeIndex).asInstanceOf[EnumOutcome]
+          val oracleSig =
+            oraclePrivKey.schnorrSignWithNonce(CryptoUtil
+                                                 .sha256(outcome.outcome)
+                                                 .bytes,
+                                               preCommittedK)
+
+          assertCorrectSigDerivation(offerSetup = offerSetup,
+                                     dlcOffer = dlcOffer,
+                                     acceptSetup = acceptSetup,
+                                     dlcAccept = dlcAccept,
+                                     oracleSigs = Vector(oracleSig),
+                                     outcome = outcome)
+      }
+    }
+  }
+
+  it should "be able to derive aggregate oracle signature from remote CET signatures" in {
+    // Larger numbers of digits make tests take too long.
+    // TODO: In the future when bases other than 10 can be used try more digits with base 2
+    val numDigitsToTest = Vector(2, 3)
+    runTestsForParam(numDigitsToTest) { numDigits =>
+      val outcomesToTest = 0
+        .until(9)
+        .toVector
+        .map(num => Vector(num) ++ Vector.fill(numDigits - 1)(0))
+
+      setupDLC(numDigits, isMultiDigit = true).flatMap {
+        case (acceptSetup, dlcAccept, offerSetup, dlcOffer, outcomes) =>
+          runTestsForParam(outcomesToTest) { outcomeToTest =>
+            val outcome = CETCalculator
+              .searchForNumericOutcome(outcomeToTest, outcomes)
+              .get
+
+            val oracleSigs = outcome.digits
+              .zip(preCommittedKs.take(numDigits))
+              .map {
+                case (digit, kVal) =>
+                  oraclePrivKey.schnorrSignWithNonce(
+                    CryptoUtil.sha256(digit.toString).bytes,
+                    kVal)
+              }
+
+            assertCorrectSigDerivation(offerSetup = offerSetup,
+                                       dlcOffer = dlcOffer,
+                                       acceptSetup = acceptSetup,
+                                       dlcAccept = dlcAccept,
+                                       oracleSigs = oracleSigs,
+                                       outcome = outcome)
+          }
+      }
+    }
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/DLCFeeTestUtil.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/DLCFeeTestUtil.scala
new file mode 100644
index 0000000000..818d70a258
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/DLCFeeTestUtil.scala
@@ -0,0 +1,116 @@
+package org.bitcoins.dlc
+
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.protocol.transaction.Transaction
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import org.scalatest.{Assertion, Assertions}
+
+object DLCFeeTestUtil extends Assertions {
+
+  def validateFees(
+      builder: DLCTxBuilder,
+      fundingTx: Transaction,
+      closingTx: Transaction,
+      fundingTxSigs: Int = 2,
+      closingTxSigs: Int = 2): Assertion = {
+    val feeRate = builder.feeRate
+    val finalizer = builder.fundingTxBuilder.fundingTxFinalizer
+    val expectedFundingFee =
+      finalizer.offerFundingFee + finalizer.acceptFundingFee
+    val expectedClosingFee =
+      finalizer.offerFutureFee + finalizer.acceptFutureFee
+
+    val fundingInput =
+      (builder.offerFundingInputs ++ builder.acceptFundingInputs)
+        .map(_.output.value)
+        .sum
+    val fundingOutput = fundingTx.outputs.map(_.value).sum
+    val actualFundingFee = fundingInput - fundingOutput
+
+    val closingInput = fundingTx.outputs.head.value
+    val closingOutput = closingTx.outputs.map(_.value).sum
+    val actualClosingFee = closingInput - closingOutput
+
+    /** Actual Fee Rate = Actual Fee / Ceil(Actual Weight / 4.0)
+      * Expected Fee Rate = Expected Fee / Ceil(Expected Weight / 4.0)
+      *
+      * Expected Fee = Actual Fee (yay!)
+      *
+      * Expected Weight - #sigs - 4 <= Actual Weight <= Expected Weight
+      * The right comparison is true because Expected Weight is designed to be an upper bound.
+      * The left comparison is true because the possible savings are from one weight being saved per
+      * signature, and 1 vbyte = 4 weight being saved if rounding works out well between both parites.
+      *
+      * Because of these comparisons, we can derive
+      *
+      * Lower Bound Fee Rate = Actual Fee / (Ceil((Actual Weight + #sigs)/4.0) + 1)
+      * Upper Bound Fee Rate = Actual Fee / Ceil(Actual Weight/4.0)
+      *
+      * So that these two fee rates correspond to vbyte amounts 1 apart and represent the
+      * actual fee rate but allowing for signature size variation after which we should match
+      * the expected fee rate. This function asserts:
+      * Lower Bound Fee Rate <= Expected Fee Rate <= Upper Bound Fee Rate
+      */
+    def feeRateBounds(
+        tx: Transaction,
+        actualFee: CurrencyUnit,
+        numSignatures: Int,
+        missingOutputBytes: Long = 0): (Double, Double) = {
+      val vbytesLower =
+        Math.ceil(tx.weight / 4.0) + missingOutputBytes
+      val vbytesUpper =
+        Math.ceil((tx.weight + numSignatures) / 4.0) + missingOutputBytes + 1
+
+      // Upper VBytes => Lower fee rate
+      val lowerBound = actualFee.satoshis.toLong / vbytesUpper
+      // Lower VBytes => Upper fee rate
+      val upperBound = actualFee.satoshis.toLong / vbytesLower
+      (lowerBound, upperBound)
+    }
+
+    val (actualFundingFeeRateLower, actualFundingFeeRateUpper) =
+      feeRateBounds(fundingTx, actualFundingFee, fundingTxSigs)
+
+    val (actualClosingFeeRateLower, actualClosingFeeRateUpper) =
+      feeRateBounds(closingTx, actualClosingFee, closingTxSigs)
+
+    assert(actualFundingFee == expectedFundingFee)
+    assert(actualClosingFee == expectedClosingFee)
+
+    val offerOutputBytes =
+      9 + builder.offerFinalAddress.scriptPubKey.asmBytes.length
+    val acceptOutputBytes =
+      9 + builder.acceptFinalAddress.scriptPubKey.asmBytes.length
+
+    val (actualClosingFeeRateWithoutOfferLower,
+         actualClosingFeeRateWithoutOfferUpper) =
+      feeRateBounds(closingTx,
+                    actualClosingFee,
+                    closingTxSigs,
+                    offerOutputBytes)
+
+    val (actualClosingFeeRateWithoutAcceptLower,
+         actualClosingFeeRateWithoutAcceptUpper) =
+      feeRateBounds(closingTx,
+                    actualClosingFee,
+                    closingTxSigs,
+                    acceptOutputBytes)
+
+    def feeRateBetweenBounds(
+        lowerBound: Double,
+        upperBound: Double): Boolean = {
+      feeRate.toLong >= lowerBound && feeRate.toLong <= upperBound
+    }
+
+    assert(
+      feeRateBetweenBounds(actualFundingFeeRateLower,
+                           actualFundingFeeRateUpper))
+    assert(
+      feeRateBetweenBounds(actualClosingFeeRateLower,
+                           actualClosingFeeRateUpper) ||
+        feeRateBetweenBounds(actualClosingFeeRateWithoutOfferLower,
+                             actualClosingFeeRateWithoutOfferUpper) ||
+        feeRateBetweenBounds(actualClosingFeeRateWithoutAcceptLower,
+                             actualClosingFeeRateWithoutAcceptUpper))
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/SetupDLCTest.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/SetupDLCTest.scala
new file mode 100644
index 0000000000..f4a975071d
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/SetupDLCTest.scala
@@ -0,0 +1,76 @@
+package org.bitcoins.dlc
+
+import org.bitcoins.core.protocol.tlv.EnumOutcome
+import org.bitcoins.core.protocol.transaction.Transaction
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.execution.{CETInfo, SetupDLC}
+import org.bitcoins.testkit.util.BitcoinSAsyncTest
+
+class SetupDLCTest extends BitcoinSAsyncTest {
+  behavior of "SetupAdaptorDLC"
+
+  val dummyTxId: DoubleSha256DigestBE = DoubleSha256DigestBE.empty
+
+  val dummyAdaptorSig: ECAdaptorSignature = ECAdaptorSignature(
+    ECPublicKey.freshPublicKey,
+    ECPrivateKey.freshPrivateKey.fieldElement,
+    ECPublicKey.freshPublicKey,
+    ECPrivateKey.freshPrivateKey.fieldElement,
+    ECPrivateKey.freshPrivateKey.fieldElement
+  )
+
+  val validFundingTx: Transaction = Transaction(
+    "02000000000102f6ec63ebf8589895147803ea2724f1cc9fbcc75077136c15af57210ab8b4342b0000000000ffffffffbfeda85fa8d2335694b3602f0e0918fa7e9d144051217330c8a0328b4d0caabd0000000000ffffffff03c8c2eb0b0000000022002060b1a927da5c8570b1280d6dd0306d6458edc1c4abb7cc3ce8f75d157e78825e1ee0f50500000000160014558979e57695d211a354b87369ae819ae720e2761ee0f50500000000160014dc93c91963fb7b42860f92caf11217ef6c28599702483045022100b9189d799cdc4845b273ff4a471fcaa36e2419609bc3e749d78668bb8c2cb1350220403cdcddf10d06b8cb36e2943d1c8d195cbc0b023d1cdaa29281dfa250a744a9012103f5413f7d813a4e1bff925fa8b1e6ce154b309d6df4433cc1c6ded5e04f4d2d6202473044022001d25acb7ad50c352604a36d20fa25426d98d9d917200b017c052954ddf97e43022005b6d6c70d029206851c5af7ac3013fda87d5536003b0eee1c29cac6903cfbbd0121039ef319718ac70f4a3e86fb4eab23adc1c41dda9109f6c700b9b06690ddb3138b00000000")
+
+  val validCET: Transaction = Transaction(
+    "0200000000010112eb723473aa9ec2a91d82072b054feb4660389dc33ec407ff5836ff1ade73490000000000feffffff029014680300000000160014f161d1f494c1617a385f4480687b49826b5287ec70ad830800000000160014ea0f8ed8de8f6190bc67a2cf19f75bea97d0d582014752210258d139dc2f0507bd2b01794ff04530fd614a86dded69fd944da1942bcf748a7e2103eaf8df8e339381a19dfa5e37a4ce3c04ad3dc62f8d57774d92154e6d26ef06a452ae7c37265f"
+  )
+
+  val validCETInfo: CETInfo = CETInfo(validCET, dummyAdaptorSig)
+
+  val validRefundTx: Transaction = Transaction(
+    "0200000000010112eb723473aa9ec2a91d82072b054feb4660389dc33ec407ff5836ff1ade73490000000000feffffff02ace0f50500000000160014f161d1f494c1617a385f4480687b49826b5287ecabe0f50500000000160014ea0f8ed8de8f6190bc67a2cf19f75bea97d0d582040047304402206e204681682139ca91abca8a090c05d335c3077bcaa801d73ade4d30cf14befc0220114da42320f563f8df7ba29bfb26549b58b4dfc40d8af3a8e352b2da180fa9f001483045022100a9aa4a45d89d936762041cc2793700c3c6228326648a66228c4e265c9938337c0220024637e716c702176bde6029342ac42118a1af774ca6fb7a8225a31b15b1c839014752210258d139dc2f0507bd2b01794ff04530fd614a86dded69fd944da1942bcf748a7e2103eaf8df8e339381a19dfa5e37a4ce3c04ad3dc62f8d57774d92154e6d26ef06a452ae7d37265f")
+
+  // These 2 can be the same, we only need them to have 1 input so we can do the correct checks
+  val invalidCET: Transaction = Transaction(
+    "02000000000101bdaa2ea7eea92a88f357bd8af92003286c5acb9e9b51006d2394b47afa1c7a040000000000ffffffff018a831e000000000017a914b80e1c53b48628277bd2cb63d9d111c8fbcecdda870400483045022100ee40ca5537b5a9e9aeb04e659a8e7ec8c2d4a33dd8f8e620c98561a9e87f2db802200c1a9e35464412b0c4c28125e0279807b1b0df649a10dbfce41fa52722d71ede01483045022100cea1701d3b7fc9ca7f83cfed3fbd43853d243249a0ece0ec7fbefe51d3c526df02202fed76ce12e54793961ef3611cefcd684c40ba4b640bb3a01abee7c1dd0fab6a01475221031454ce0a0354aadf6bd13f4e27c1287d33534dd02e249d4455341d528b7ea7192103ab051b06e850b33196ddd80b43084883a29c854c0c5a924b273cbe4b1c3a228452ae00000000"
+  )
+
+  val invalidRefundTx: Transaction = invalidCET
+
+  def setupDLC(
+      fundingTx: Transaction = validFundingTx,
+      cet0: CETInfo = validCETInfo,
+      cet1: CETInfo = validCETInfo,
+      refundTx: Transaction = validRefundTx): SetupDLC = {
+    SetupDLC(
+      fundingTx = fundingTx,
+      cets = Map(EnumOutcome("WIN") -> cet0, EnumOutcome("LOSE") -> cet1),
+      refundTx = refundTx
+    )
+  }
+
+  it must "not allow an invalid number of inputs for CETs" in {
+    // Funding tx has more than 1 input
+    assertThrows[IllegalArgumentException](
+      setupDLC(cet0 = validCETInfo.copy(tx = validFundingTx)))
+    assertThrows[IllegalArgumentException](
+      setupDLC(cet1 = validCETInfo.copy(tx = validFundingTx)))
+  }
+
+  it must "not allow an invalid input for CETs" in {
+    assertThrows[IllegalArgumentException](
+      setupDLC(cet0 = validCETInfo.copy(tx = invalidCET)))
+    assertThrows[IllegalArgumentException](
+      setupDLC(cet1 = validCETInfo.copy(tx = invalidCET)))
+  }
+
+  it must "not allow an invalid number of inputs for the refundTx" in {
+    // Funding tx has more than 1 input
+    assertThrows[IllegalArgumentException](setupDLC(refundTx = validFundingTx))
+  }
+
+  it must "not allow an invalid input for the refundTx" in {
+    assertThrows[IllegalArgumentException](setupDLC(refundTx = invalidRefundTx))
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCFeeTestVectorTest.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCFeeTestVectorTest.scala
new file mode 100644
index 0000000000..633a1946df
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCFeeTestVectorTest.scala
@@ -0,0 +1,56 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.testkit.core.gen.FeeUnitGen
+import org.bitcoins.testkit.util.BitcoinSUnitTest
+import org.scalacheck.Gen
+
+class DLCFeeTestVectorTest extends BitcoinSUnitTest {
+
+  implicit override val generatorDrivenConfig: PropertyCheckConfiguration =
+    generatorDrivenConfigNewCode
+
+  behavior of "DLCFeeTestVector"
+
+  it should "have serialization symmetry" in {
+    val inputGen = for {
+      redeemScriptLen <- Gen.oneOf(0, 22, 34)
+      maxWitnessLen <- Gen.oneOf(Gen.choose(1, 300), Gen.oneOf(107, 108))
+    } yield FundingFeeInfo(redeemScriptLen, maxWitnessLen)
+
+    val gen = for {
+      numOfferInputs <- Gen.choose(1, 10)
+      offerInputs <- Gen.listOfN(numOfferInputs, inputGen)
+      offerPayoutSPKLen <- Gen.oneOf(22, 25, 34, 35, 71, 173)
+      offerChangeSPKLen <- Gen.oneOf(22, 34)
+      numAcceptInputs <- Gen.choose(1, 10)
+      acceptInputs <- Gen.listOfN(numAcceptInputs, inputGen)
+      acceptPayoutSPKLen <- Gen.oneOf(22, 25, 34, 35, 71, 173)
+      acceptChangeSPKLen <- Gen.oneOf(22, 34)
+      feeRate <- FeeUnitGen.satsPerVirtualByte
+    } yield {
+      DLCFeeTestVector(offerInputs.toVector,
+                       offerPayoutSPKLen,
+                       offerChangeSPKLen,
+                       acceptInputs.toVector,
+                       acceptPayoutSPKLen,
+                       acceptChangeSPKLen,
+                       feeRate)
+    }
+
+    forAll(gen) { feeTest =>
+      val feeTestResult = DLCFeeTestVector.fromJson(feeTest.toJson)
+      assert(feeTestResult.isSuccess)
+      assert(feeTestResult.get == feeTest)
+    }
+  }
+
+  it should "pass dlc_fee_test" in {
+    val vecResult = DLCFeeTestVectorGen.readFromDefaultTestFile()
+    assert(vecResult.isSuccess)
+
+    vecResult.get.foldLeft(succeed) {
+      case (_, testVec) =>
+        assert(DLCFeeTestVector(testVec.inputs) == testVec)
+    }
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCParsingTestVectorTest.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCParsingTestVectorTest.scala
new file mode 100644
index 0000000000..5ee633f646
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCParsingTestVectorTest.scala
@@ -0,0 +1,48 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.core.protocol.tlv.{LnMessage, TLV}
+import org.bitcoins.crypto.NetworkElement
+import org.bitcoins.testkit.util.BitcoinSUnitTest
+import org.scalacheck.Gen
+
+class DLCParsingTestVectorTest extends BitcoinSUnitTest {
+
+  implicit override val generatorDrivenConfig: PropertyCheckConfiguration =
+    generatorDrivenConfigNewCode
+
+  behavior of "DLCParsingTestVector"
+
+  it should "have serialization symmetry" in {
+    val gen = Gen.oneOf(
+      DLCTLVGen.contractInfoParsingTestVector(),
+      DLCTLVGen.oracleInfoParsingTestVector(),
+      DLCTLVGen.fundingInputParsingTestVector(),
+      DLCTLVGen.cetSigsParsingTestVector(),
+      DLCTLVGen.fundingSigsParsingTestVector(),
+      DLCTLVGen.dlcOfferParsingTestVector(),
+      DLCTLVGen.dlcAcceptParsingTestVector(),
+      DLCTLVGen.dlcSignParsingTestVector()
+    )
+
+    forAll(gen) { parsingTest =>
+      val parsingTestResult = DLCParsingTestVector.fromJson(parsingTest.toJson)
+      assert(parsingTestResult.isSuccess)
+      assert(parsingTestResult.get == parsingTest)
+    }
+  }
+
+  it should "pass dlc_message_test" in {
+    val vecResult = DLCParsingTestVectorGen.readFromDefaultTestFile()
+    assert(vecResult.isSuccess)
+
+    vecResult.get.foldLeft(succeed) {
+      case (_, testVec) =>
+        val tlv = testVec.input match {
+          case tlv: TLV            => tlv
+          case msg: LnMessage[TLV] => msg.tlv
+          case _: NetworkElement   => fail(s"Could not parse input $testVec")
+        }
+        assert(DLCParsingTestVector(tlv) == testVec)
+    }
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCTestVectorTest.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCTestVectorTest.scala
new file mode 100644
index 0000000000..ee17ade471
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCTestVectorTest.scala
@@ -0,0 +1,37 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.testkit.util.BitcoinSAsyncTest
+import org.scalacheck.Gen
+
+import scala.concurrent.Future
+
+class DLCTestVectorTest extends BitcoinSAsyncTest {
+  behavior of "DLCTestVectors"
+
+  it should "have serialization symmetry" in {
+    val gen = TestVectorUtil.testInputGen.map(DLCTxGen.successTestVector(_))
+
+    forAllAsync(gen) { testVectorF =>
+      testVectorF.map { testVector =>
+        assert(DLCTestVector.fromJson(testVector.toJson).contains(testVector))
+      }
+    }
+  }
+
+  it should "pass dlc_test" in {
+    val vecResult = DLCTestVectorGen.readFromDefaultTestFile()
+    assert(vecResult.isSuccess)
+
+    vecResult.get.foldLeft(Future.successful(succeed)) {
+      case (assertF, testVec) =>
+        assertF.flatMap { _ =>
+          testVec match {
+            case testVec: SuccessTestVector =>
+              DLCTxGen
+                .successTestVector(testVec.testInputs)
+                .map(regenerated => assert(regenerated == testVec))
+          }
+        }
+    }
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCTxTestVectorTest.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCTxTestVectorTest.scala
new file mode 100644
index 0000000000..41383c2d4c
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/DLCTxTestVectorTest.scala
@@ -0,0 +1,35 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.testkit.util.BitcoinSAsyncTest
+
+import scala.concurrent.Future
+
+class DLCTxTestVectorTest extends BitcoinSAsyncTest {
+  behavior of "DLCTxTestVector"
+
+  it should "have serialization symmetry" in {
+    val gen = TestVectorUtil.testInputGen.map(DLCTxGen.dlcTxTestVector(_))
+
+    forAllAsync(gen) { testVecF =>
+      testVecF.map { testVec =>
+        val testVecResult = DLCTxTestVector.fromJson(testVec.toJson)
+        assert(testVecResult.isSuccess)
+        assert(testVecResult.get == testVec)
+      }
+    }
+  }
+
+  it should "pass dlc_tx_test" in {
+    val vecResult = DLCTxTestVectorGen.readFromDefaultTestFile()
+    assert(vecResult.isSuccess)
+
+    vecResult.get.foldLeft(Future.successful(succeed)) {
+      case (assertF, testVec) =>
+        assertF.flatMap { _ =>
+          DLCTxGen
+            .dlcTxTestVector(testVec.inputs)
+            .map(regenerated => assert(regenerated == testVec))
+        }
+    }
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVectorTest.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVectorTest.scala
new file mode 100644
index 0000000000..c845c957ae
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVectorTest.scala
@@ -0,0 +1,40 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.testkit.core.gen.CryptoGenerators
+import org.bitcoins.testkit.util.BitcoinSUnitTest
+
+class SchnorrSigPointTestVectorTest extends BitcoinSUnitTest {
+
+  implicit override val generatorDrivenConfig: PropertyCheckConfiguration =
+    generatorDrivenConfigNewCode
+
+  behavior of "SchnorrSigPointTestVector"
+
+  it should "have serialization symmetry" in {
+    val gen = for {
+      privKey <- CryptoGenerators.privateKey
+      privNonce <- CryptoGenerators.privateKey
+      hash <- CryptoGenerators.sha256Digest
+    } yield SchnorrSigPointTestVector(privKey, privNonce, hash)
+
+    forAll(gen) { schnorrSigPointTest =>
+      val schnorrSigPointTestResult =
+        SchnorrSigPointTestVector.fromJson(schnorrSigPointTest.toJson)
+      assert(schnorrSigPointTestResult.isSuccess)
+      assert(schnorrSigPointTestResult.get == schnorrSigPointTest)
+    }
+  }
+
+  it should "pass dlc_schnorr_test" in {
+    val vecResult = SchnorrSigPointTestVectorGen.readFromDefaultTestFile()
+    assert(vecResult.isSuccess)
+
+    vecResult.get.foldLeft(succeed) {
+      case (_, testVec) =>
+        assert(SchnorrSigPointTestVector(testVec.inputs) == testVec)
+        assert(
+          testVec.pubKey.computeSigPoint(testVec.msgHash.bytes,
+                                         testVec.pubNonce) == testVec.sigPoint)
+    }
+  }
+}
diff --git a/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/TestVectorUtil.scala b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/TestVectorUtil.scala
new file mode 100644
index 0000000000..380b4edc9a
--- /dev/null
+++ b/dlc-test/src/test/scala/org/bitcoins/dlc/testgen/TestVectorUtil.scala
@@ -0,0 +1,32 @@
+package org.bitcoins.dlc.testgen
+
+import org.scalacheck.Gen
+
+object TestVectorUtil {
+
+  val p2wpkhInputGen: Gen[FundingInputTx] =
+    Gen.const(()).map(_ => DLCTxGen.fundingInputTx())
+
+  val p2wshInputGen: Gen[FundingInputTx] =
+    Gen.const(()).map(_ => DLCTxGen.multiSigFundingInputTx())
+
+  val p2shInputGen: Gen[FundingInputTx] =
+    Gen.const(()).map(_ => DLCTxGen.multiSigFundingInputTx(p2shNested = true))
+
+  val inputGen: Gen[FundingInputTx] =
+    Gen.oneOf(p2wpkhInputGen, p2wshInputGen, p2shInputGen)
+
+  val inputsGen: Gen[List[FundingInputTx]] =
+    Gen.oneOf(1, 2, 3, 8).flatMap(Gen.listOfN(_, inputGen))
+
+  val testInputGen: Gen[ValidTestInputs] =
+    Gen.choose(2, 100).flatMap { numOutcomes =>
+      inputsGen.flatMap { offerInputs =>
+        inputsGen.flatMap { acceptInputs =>
+          DLCTxGen.validTestInputsForInputs(offerInputs.toVector,
+                                            acceptInputs.toVector,
+                                            numOutcomes)
+        }
+      }
+    }
+}
diff --git a/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCDAOTest.scala b/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCDAOTest.scala
new file mode 100644
index 0000000000..519d40e43c
--- /dev/null
+++ b/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCDAOTest.scala
@@ -0,0 +1,202 @@
+package org.bitcoins.dlc.wallet
+
+import org.bitcoins.core.api.wallet.db.TransactionDbHelper
+import org.bitcoins.core.currency.Satoshis
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.script.EmptyScriptPubKey
+import org.bitcoins.core.protocol.tlv.{EnumOutcome, UnsignedNumericOutcome}
+import org.bitcoins.core.protocol.transaction.{
+  TransactionOutPoint,
+  TransactionOutput
+}
+import org.bitcoins.crypto.{ECAdaptorSignature, Sha256DigestBE}
+import org.bitcoins.db.CRUD
+import org.bitcoins.dlc.wallet.models._
+import org.bitcoins.testkit.fixtures.DLCDAOFixture
+import org.bitcoins.testkit.wallet.{BitcoinSWalletTest, DLCWalletUtil}
+import org.scalatest.Assertion
+
+import scala.concurrent.Future
+
+class DLCDAOTest extends BitcoinSWalletTest with DLCDAOFixture {
+
+  behavior of "DLCDAO"
+
+  val dlcDb: DLCDb = DLCWalletUtil.sampleDLCDb
+
+  val paramHash: Sha256DigestBE = dlcDb.paramHash
+
+  def verifyDatabaseInsertion[ElementType, KeyType](
+      element: ElementType,
+      key: KeyType,
+      dao: CRUD[ElementType, KeyType],
+      dlcDAO: DLCDAO): Future[Assertion] = {
+    for {
+      _ <- dlcDAO.create(dlcDb)
+      _ <- dao.upsert(element) //upsert in case we are testing the dlcDAO
+
+      read <- dao.read(key)
+    } yield {
+      assert(read.contains(element))
+    }
+  }
+
+  it should "correctly insert a DLC into the database" in { daos =>
+    val dlcDAO = daos.dlcDAO
+    verifyDatabaseInsertion(dlcDb, paramHash, dlcDAO, dlcDAO)
+  }
+
+  it should "correctly insert a DLCOffer into the database" in { daos =>
+    val dlcDAO = daos.dlcDAO
+    val offerDAO = daos.dlcOfferDAO
+
+    val offerDb =
+      DLCOfferDbHelper.fromDLCOffer(DLCWalletUtil.sampleDLCOffer)
+
+    verifyDatabaseInsertion(offerDb, paramHash, offerDAO, dlcDAO)
+  }
+
+  it should "correctly insert a DLCAccept into the database" in { daos =>
+    val dlcDAO = daos.dlcDAO
+    val acceptDAO = daos.dlcAcceptDAO
+
+    val acceptDb =
+      DLCAcceptDbHelper.fromDLCAccept(paramHash, DLCWalletUtil.sampleDLCAccept)
+
+    verifyDatabaseInsertion(acceptDb, paramHash, acceptDAO, dlcDAO)
+  }
+
+  it should "correctly insert funding inputs into the database" in { daos =>
+    val dlcDAO = daos.dlcDAO
+    val inputsDAO = daos.dlcInputsDAO
+
+    val input = DLCFundingInputDb(
+      paramHash = paramHash,
+      isInitiator = true,
+      outPoint = TransactionOutPoint(testBlockHash, UInt32.zero),
+      output = TransactionOutput(Satoshis.one, EmptyScriptPubKey),
+      redeemScriptOpt = None,
+      witnessScriptOpt = Some(DLCWalletUtil.dummyScriptWitness)
+    )
+
+    verifyDatabaseInsertion(input, input.outPoint, inputsDAO, dlcDAO)
+  }
+
+  it should "correctly find funding inputs by eventId and isInitiator" in {
+    daos =>
+      val inputsDAO = daos.dlcInputsDAO
+      val dlcDAO = daos.dlcDAO
+
+      val inputs = Vector(
+        DLCFundingInputDb(
+          paramHash = paramHash,
+          isInitiator = true,
+          outPoint = TransactionOutPoint(testBlockHash, UInt32.zero),
+          output = TransactionOutput(Satoshis.one, EmptyScriptPubKey),
+          redeemScriptOpt = None,
+          witnessScriptOpt = Some(DLCWalletUtil.dummyScriptWitness)
+        ),
+        DLCFundingInputDb(
+          paramHash = paramHash,
+          isInitiator = false,
+          outPoint = TransactionOutPoint(testBlockHash, UInt32.one),
+          output = TransactionOutput(Satoshis.one, EmptyScriptPubKey),
+          redeemScriptOpt = None,
+          witnessScriptOpt = Some(DLCWalletUtil.dummyScriptWitness)
+        ),
+        DLCFundingInputDb(
+          paramHash = paramHash,
+          isInitiator = true,
+          outPoint = TransactionOutPoint(testBlockHash, UInt32(3)),
+          output = TransactionOutput(Satoshis.one, EmptyScriptPubKey),
+          redeemScriptOpt = None,
+          witnessScriptOpt = Some(DLCWalletUtil.dummyScriptWitness)
+        )
+      )
+
+      for {
+        _ <- dlcDAO.create(dlcDb)
+        _ <- inputsDAO.createAll(inputs)
+
+        readInput <- inputsDAO.findByParamHash(paramHash, isInitiator = true)
+      } yield assert(readInput.size == 2)
+  }
+
+  it should "correctly insert enum outcome CET signatures into the database" in {
+    daos =>
+      val dlcDAO = daos.dlcDAO
+      val sigsDAO = daos.dlcSigsDAO
+
+      val sig = DLCCETSignatureDb(
+        paramHash = paramHash,
+        isInitiator = true,
+        outcome = EnumOutcome(DLCWalletUtil.winStr),
+        signature = ECAdaptorSignature.dummy
+      )
+
+      verifyDatabaseInsertion(sig,
+                              (sig.paramHash, sig.outcome),
+                              sigsDAO,
+                              dlcDAO)
+  }
+
+  it should "correctly insert unsigned numeric outcome CET signatures into the database" in {
+    daos =>
+      val dlcDAO = daos.dlcDAO
+      val sigsDAO = daos.dlcSigsDAO
+
+      val outcomes = 0.to(100).toVector
+
+      val sig = DLCCETSignatureDb(
+        paramHash = paramHash,
+        isInitiator = true,
+        outcome = UnsignedNumericOutcome(outcomes),
+        signature = ECAdaptorSignature.dummy
+      )
+
+      verifyDatabaseInsertion(sig,
+                              (sig.paramHash, sig.outcome),
+                              sigsDAO,
+                              dlcDAO)
+  }
+
+  it should "correctly find CET signatures by eventId" in { daos =>
+    val dlcDAO = daos.dlcDAO
+    val sigsDAO = daos.dlcSigsDAO
+
+    val sigs = Vector(
+      DLCCETSignatureDb(
+        paramHash = paramHash,
+        isInitiator = true,
+        outcome = EnumOutcome(DLCWalletUtil.winStr),
+        signature = ECAdaptorSignature.dummy
+      ),
+      DLCCETSignatureDb(
+        paramHash = paramHash,
+        isInitiator = false,
+        outcome = EnumOutcome(DLCWalletUtil.loseStr),
+        signature = ECAdaptorSignature.dummy
+      )
+    )
+
+    for {
+      _ <- dlcDAO.create(dlcDb)
+      _ <- sigsDAO.createAll(sigs)
+
+      readInput <- sigsDAO.findByParamHash(paramHash)
+    } yield {
+      assert(readInput.size == 2)
+      // Do it this way so ordering doesn't matter
+      assert(readInput.contains(sigs.head))
+      assert(readInput.contains(sigs.last))
+    }
+  }
+
+  it should "correctly insert txs into the database" in { daos =>
+    val remoteTxDAO = daos.dlcRemoteTxDAO
+
+    val tx = TransactionDbHelper.fromTransaction(DLCWalletUtil.dummyPrevTx)
+
+    verifyDatabaseInsertion(tx, tx.txIdBE, remoteTxDAO, daos.dlcDAO)
+  }
+}
diff --git a/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCExecutionTest.scala b/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCExecutionTest.scala
new file mode 100644
index 0000000000..806ee6d203
--- /dev/null
+++ b/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCExecutionTest.scala
@@ -0,0 +1,300 @@
+package org.bitcoins.dlc.wallet
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.{
+  ContractInfo,
+  MultiNonceContractInfo,
+  SingleNonceContractInfo
+}
+import org.bitcoins.commons.jsonmodels.dlc.DLCState
+import org.bitcoins.commons.jsonmodels.dlc.DLCStatus.{
+  Claimed,
+  Refunded,
+  RemoteClaimed
+}
+import org.bitcoins.core.currency.Satoshis
+import org.bitcoins.core.script.interpreter.ScriptInterpreter
+import org.bitcoins.crypto.{CryptoUtil, SchnorrDigitalSignature}
+import org.bitcoins.testkit.wallet.DLCWalletUtil._
+import org.bitcoins.testkit.wallet.{BitcoinSDualWalletTest, DLCWalletUtil}
+import org.scalatest.FutureOutcome
+
+class DLCExecutionTest extends BitcoinSDualWalletTest {
+  type FixtureParam = (InitializedDLCWallet, InitializedDLCWallet)
+
+  override def withFixture(test: OneArgAsyncTest): FutureOutcome = {
+    withDualDLCWallets(test, multiNonce = false)
+  }
+
+  behavior of "DLCWallet"
+
+  def getSigs(contractInfo: ContractInfo): (
+      SchnorrDigitalSignature,
+      SchnorrDigitalSignature) = {
+    val info: SingleNonceContractInfo = contractInfo match {
+      case info: SingleNonceContractInfo => info
+      case _: MultiNonceContractInfo =>
+        throw new IllegalArgumentException("Unexpected Contract Info")
+    }
+
+    // Get a hash that the initiator wins for
+    val initiatorWinStr =
+      info
+        .maxBy(_._2.toLong)
+        ._1
+        .outcome
+    val initiatorWinSig = DLCWalletUtil.oraclePrivKey
+      .schnorrSignWithNonce(CryptoUtil.sha256(initiatorWinStr).bytes,
+                            DLCWalletUtil.kValue)
+
+    // Get a hash that the recipient wins for
+    val recipientWinStr =
+      info.find(_._2 == Satoshis.zero).get._1.outcome
+    val recipientWinSig = DLCWalletUtil.oraclePrivKey
+      .schnorrSignWithNonce(CryptoUtil.sha256(recipientWinStr).bytes,
+                            DLCWalletUtil.kValue)
+
+    (initiatorWinSig, recipientWinSig)
+  }
+
+  it must "get the correct funding transaction" in { wallets =>
+    val dlcA = wallets._1.wallet
+    val dlcB = wallets._2.wallet
+
+    for {
+      contractId <- getContractId(dlcA)
+      offerDb <- getInitialOffer(dlcA)
+      paramHash = offerDb.paramHash
+      offerOpt <- dlcA.dlcOfferDAO.findByParamHash(paramHash)
+      acceptOpt <- dlcB.dlcAcceptDAO.findByParamHash(paramHash)
+
+      inputsA <- dlcA.dlcInputsDAO.findByParamHash(paramHash)
+      inputsB <- dlcB.dlcInputsDAO.findByParamHash(paramHash)
+
+      fundingTx <- dlcB.getDLCFundingTx(contractId)
+    } yield {
+      assert(offerOpt.isDefined)
+      assert(acceptOpt.isDefined)
+
+      val offer = offerOpt.get
+      val accept = acceptOpt.get
+
+      val comparableInputsA = inputsA
+        .sortBy(_.outPoint.hex)
+        .map(_.copy(redeemScriptOpt = None, witnessScriptOpt = None))
+      val comparableInputsB =
+        inputsB
+          .sortBy(_.outPoint.hex)
+          .map(
+            _.copy(redeemScriptOpt = None, witnessScriptOpt = None)
+          ) // initiator will not have funding sigs
+
+      assert(comparableInputsA == comparableInputsB)
+
+      val fundingTxOutpoints = fundingTx.inputs.map(_.previousOutput)
+      val outpointsA = inputsA.map(_.outPoint)
+      val outpointsB = inputsB.map(_.outPoint)
+
+      assert(fundingTxOutpoints.diff(outpointsA ++ outpointsB).isEmpty)
+
+      assert(fundingTx.outputs.size == 3)
+      assert(
+        fundingTx.outputs.exists(
+          _.scriptPubKey == offer.changeAddress.scriptPubKey))
+      assert(
+        fundingTx.outputs.exists(
+          _.scriptPubKey == accept.changeAddress.scriptPubKey))
+      assert(ScriptInterpreter.checkTransaction(fundingTx))
+
+      val fundingTxPrevOutputRefs = inputsA.map(_.toOutputReference) ++ inputsB
+        .map(_.toOutputReference)
+
+      val fundingTxVerify = fundingTx.inputs.zipWithIndex.forall {
+        case (input, index) =>
+          val output = fundingTxPrevOutputRefs
+            .find(_.outPoint == input.previousOutput)
+            .get
+            .output
+          verifyInput(fundingTx, index, output)
+      }
+      assert(fundingTxVerify)
+    }
+  }
+
+  it must "do a unilateral close as the initiator" in { wallets =>
+    for {
+      contractId <- getContractId(wallets._1.wallet)
+      offer <- getInitialOffer(wallets._1.wallet)
+      (sig, _) = getSigs(offer.contractInfo)
+      func = (wallet: DLCWallet) => wallet.executeDLC(contractId, sig)
+
+      result <- dlcExecutionTest(wallets = wallets,
+                                 asInitiator = true,
+                                 func = func,
+                                 expectedOutputs = 1)
+
+      _ = assert(result)
+
+      dlcDbAOpt <- wallets._1.wallet.dlcDAO.findByContractId(contractId)
+      dlcDbBOpt <- wallets._2.wallet.dlcDAO.findByContractId(contractId)
+
+      paramHash = dlcDbAOpt.get.paramHash
+
+      statusAOpt <- wallets._1.wallet.findDLC(paramHash)
+      statusBOpt <- wallets._2.wallet.findDLC(paramHash)
+
+      _ = {
+        (statusAOpt, statusBOpt) match {
+          case (Some(statusA: Claimed), Some(statusB: RemoteClaimed)) =>
+            assert(statusA.oracleSigs == Vector(statusB.oracleSig))
+          case (_, _) => fail()
+        }
+      }
+    } yield {
+      (dlcDbAOpt, dlcDbBOpt) match {
+        case (Some(dlcA), Some(dlcB)) =>
+          assert(dlcA.state == DLCState.Claimed)
+          assert(dlcB.state == DLCState.RemoteClaimed)
+        case (_, _) => fail()
+      }
+    }
+  }
+
+  it must "do a unilateral close as the recipient" in { wallets =>
+    for {
+      contractId <- getContractId(wallets._1.wallet)
+      offer <- getInitialOffer(wallets._2.wallet)
+      (_, sig) = getSigs(offer.contractInfo)
+      func = (wallet: DLCWallet) => wallet.executeDLC(contractId, sig)
+
+      result <- dlcExecutionTest(wallets = wallets,
+                                 asInitiator = false,
+                                 func = func,
+                                 expectedOutputs = 1)
+
+      _ = assert(result)
+
+      dlcDbAOpt <- wallets._1.wallet.dlcDAO.findByContractId(contractId)
+      dlcDbBOpt <- wallets._2.wallet.dlcDAO.findByContractId(contractId)
+
+      paramHash = dlcDbAOpt.get.paramHash
+
+      statusAOpt <- wallets._1.wallet.findDLC(paramHash)
+      statusBOpt <- wallets._2.wallet.findDLC(paramHash)
+
+      _ = {
+        (statusAOpt, statusBOpt) match {
+          case (Some(statusA: RemoteClaimed), Some(statusB: Claimed)) =>
+            assert(Vector(statusA.oracleSig) == statusB.oracleSigs)
+          case (_, _) => fail()
+        }
+      }
+    } yield {
+      (dlcDbAOpt, dlcDbBOpt) match {
+        case (Some(dlcA), Some(dlcB)) =>
+          assert(dlcA.state == DLCState.RemoteClaimed)
+          assert(dlcB.state == DLCState.Claimed)
+        case (_, _) => fail()
+      }
+    }
+  }
+
+  it must "fail to do losing unilateral close" in { wallets =>
+    val dlcA = wallets._1.wallet
+
+    val executeDLCForceCloseF = for {
+      contractId <- getContractId(wallets._1.wallet)
+      offer <- getInitialOffer(dlcA)
+      (_, sig) = getSigs(offer.contractInfo)
+
+      tx <- dlcA.executeDLC(contractId, sig)
+    } yield tx
+
+    recoverToSucceededIf[UnsupportedOperationException](executeDLCForceCloseF)
+  }
+
+  it must "do a refund on a dlc as the initiator" in { wallets =>
+    for {
+      contractId <- getContractId(wallets._1.wallet)
+      func = (wallet: DLCWallet) => wallet.executeDLCRefund(contractId)
+
+      result <- dlcExecutionTest(wallets = wallets,
+                                 asInitiator = true,
+                                 func = func,
+                                 expectedOutputs = 2)
+
+      _ = assert(result)
+
+      dlcDbAOpt <- wallets._1.wallet.dlcDAO.findByContractId(contractId)
+      dlcDbBOpt <- wallets._2.wallet.dlcDAO.findByContractId(contractId)
+
+      paramHash = dlcDbAOpt.get.paramHash
+
+      statusAOpt <- wallets._1.wallet.findDLC(paramHash)
+      statusBOpt <- wallets._2.wallet.findDLC(paramHash)
+
+      _ = {
+        (statusAOpt, statusBOpt) match {
+          case (Some(statusA: Refunded), Some(statusB: Refunded)) =>
+            assert(statusA.closingTxId == statusB.closingTxId)
+          case (_, _) => fail()
+        }
+      }
+    } yield {
+      (dlcDbAOpt, dlcDbBOpt) match {
+        case (Some(dlcA), Some(dlcB)) =>
+          assert(dlcA.state == DLCState.Refunded)
+          assert(dlcB.state == DLCState.Refunded)
+        case (_, _) => fail()
+      }
+    }
+  }
+
+  it must "do a refund on a dlc as the recipient" in { wallets =>
+    for {
+      contractId <- getContractId(wallets._1.wallet)
+      func = (wallet: DLCWallet) => wallet.executeDLCRefund(contractId)
+
+      result <- dlcExecutionTest(wallets = wallets,
+                                 asInitiator = false,
+                                 func = func,
+                                 expectedOutputs = 2)
+
+      _ = assert(result)
+
+      dlcDbAOpt <- wallets._1.wallet.dlcDAO.findByContractId(contractId)
+      dlcDbBOpt <- wallets._2.wallet.dlcDAO.findByContractId(contractId)
+
+      paramHash = dlcDbAOpt.get.paramHash
+
+      statusAOpt <- wallets._1.wallet.findDLC(paramHash)
+      statusBOpt <- wallets._2.wallet.findDLC(paramHash)
+
+      _ = {
+        (statusAOpt, statusBOpt) match {
+          case (Some(statusA: Refunded), Some(statusB: Refunded)) =>
+            assert(statusA.closingTxId == statusB.closingTxId)
+          case (_, _) => fail()
+        }
+      }
+    } yield {
+      (dlcDbAOpt, dlcDbBOpt) match {
+        case (Some(dlcA), Some(dlcB)) =>
+          assert(dlcA.state == DLCState.Refunded)
+          assert(dlcB.state == DLCState.Refunded)
+        case (_, _) => fail()
+      }
+    }
+  }
+
+  it must "fail to execute with an empty vec of sigs" in { wallets =>
+    val dlcA = wallets._1.wallet
+
+    val executeDLCForceCloseF = for {
+      contractId <- getContractId(wallets._1.wallet)
+
+      tx <- dlcA.executeDLC(contractId, Vector.empty)
+    } yield tx
+
+    recoverToSucceededIf[IllegalArgumentException](executeDLCForceCloseF)
+  }
+}
diff --git a/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCMultiNonceExecutionTest.scala b/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCMultiNonceExecutionTest.scala
new file mode 100644
index 0000000000..eafe09a8bc
--- /dev/null
+++ b/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/DLCMultiNonceExecutionTest.scala
@@ -0,0 +1,165 @@
+package org.bitcoins.dlc.wallet
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.{
+  ContractInfo,
+  MultiNonceContractInfo,
+  SingleNonceContractInfo
+}
+import org.bitcoins.commons.jsonmodels.dlc.DLCState
+import org.bitcoins.commons.jsonmodels.dlc.DLCStatus.{Claimed, RemoteClaimed}
+import org.bitcoins.core.currency.Satoshis
+import org.bitcoins.core.protocol.tlv.{EnumOutcome, UnsignedNumericOutcome}
+import org.bitcoins.crypto._
+import org.bitcoins.testkit.wallet.DLCWalletUtil._
+import org.bitcoins.testkit.wallet.{BitcoinSDualWalletTest, DLCWalletUtil}
+import org.scalatest.FutureOutcome
+
+class DLCMultiNonceExecutionTest extends BitcoinSDualWalletTest {
+  type FixtureParam = (InitializedDLCWallet, InitializedDLCWallet)
+
+  override def withFixture(test: OneArgAsyncTest): FutureOutcome = {
+    withDualDLCWallets(test, multiNonce = true)
+  }
+
+  behavior of "DLCWallet"
+
+  def getSigs(contractInfo: ContractInfo): (
+      Vector[SchnorrDigitalSignature],
+      Vector[SchnorrDigitalSignature]) = {
+    val multiNonceContractInfo: MultiNonceContractInfo = contractInfo match {
+      case info: MultiNonceContractInfo => info
+      case _: SingleNonceContractInfo =>
+        throw new IllegalArgumentException("Unexpected Contract Info")
+    }
+
+    val initiatorWinVec =
+      multiNonceContractInfo.outcomeVec
+        .maxBy(_._2.toLong)
+        ._1
+
+    val kValues = DLCWalletUtil.kValues.take(initiatorWinVec.size)
+
+    val initiatorWinSigs = initiatorWinVec.zip(kValues).map {
+      case (num, kValue) =>
+        DLCWalletUtil.oraclePrivKey
+          .schnorrSignWithNonce(CryptoUtil.sha256(num.toString).bytes, kValue)
+    }
+
+    val recipientWinVec =
+      multiNonceContractInfo.outcomeVec.find(_._2 == Satoshis.zero).get._1
+
+    val kValues2 = DLCWalletUtil.kValues.take(recipientWinVec.size)
+
+    val recipientWinSigs = recipientWinVec.zip(kValues2).map {
+      case (num, kValue) =>
+        DLCWalletUtil.oraclePrivKey
+          .schnorrSignWithNonce(CryptoUtil.sha256(num.toString).bytes, kValue)
+    }
+
+    (initiatorWinSigs, recipientWinSigs)
+  }
+
+  it must "execute as the initiator" in { wallets =>
+    for {
+      contractId <- getContractId(wallets._1.wallet)
+      offer <- getInitialOffer(wallets._1.wallet)
+      (sigs, _) = getSigs(offer.contractInfo)
+      func = (wallet: DLCWallet) => wallet.executeDLC(contractId, sigs)
+
+      result <- dlcExecutionTest(wallets = wallets,
+                                 asInitiator = true,
+                                 func = func,
+                                 expectedOutputs = 1)
+
+      _ = assert(result)
+
+      dlcDbAOpt <- wallets._1.wallet.dlcDAO.findByContractId(contractId)
+      dlcDbBOpt <- wallets._2.wallet.dlcDAO.findByContractId(contractId)
+
+      paramHash = dlcDbAOpt.get.paramHash
+
+      statusAOpt <- wallets._1.wallet.findDLC(paramHash)
+      statusBOpt <- wallets._2.wallet.findDLC(paramHash)
+
+      _ = {
+        (statusAOpt, statusBOpt) match {
+          case (Some(statusA: Claimed), Some(statusB: RemoteClaimed)) =>
+            verifyingMatchingOracleSigs(statusA, statusB)
+          case (_, _) => fail()
+        }
+      }
+    } yield {
+      (dlcDbAOpt, dlcDbBOpt) match {
+        case (Some(dlcA), Some(dlcB)) =>
+          assert(dlcA.state == DLCState.Claimed)
+          assert(dlcB.state == DLCState.RemoteClaimed)
+        case (_, _) => fail()
+      }
+    }
+  }
+
+  it must "execute as the recipient" in { wallets =>
+    for {
+      contractId <- getContractId(wallets._1.wallet)
+      offer <- getInitialOffer(wallets._2.wallet)
+      (_, sigs) = getSigs(offer.contractInfo)
+      func = (wallet: DLCWallet) => wallet.executeDLC(contractId, sigs)
+
+      result <- dlcExecutionTest(wallets = wallets,
+                                 asInitiator = false,
+                                 func = func,
+                                 expectedOutputs = 1)
+
+      _ = assert(result)
+
+      dlcDbAOpt <- wallets._1.wallet.dlcDAO.findByContractId(contractId)
+      dlcDbBOpt <- wallets._2.wallet.dlcDAO.findByContractId(contractId)
+
+      paramHash = dlcDbAOpt.get.paramHash
+
+      statusAOpt <- wallets._1.wallet.findDLC(paramHash)
+      statusBOpt <- wallets._2.wallet.findDLC(paramHash)
+
+      _ = {
+        (statusAOpt, statusBOpt) match {
+          case (Some(statusA: RemoteClaimed), Some(statusB: Claimed)) =>
+            verifyingMatchingOracleSigs(statusB, statusA)
+          case (_, _) => fail()
+        }
+      }
+    } yield {
+      (dlcDbAOpt, dlcDbBOpt) match {
+        case (Some(dlcA), Some(dlcB)) =>
+          assert(dlcA.state == DLCState.RemoteClaimed)
+          assert(dlcB.state == DLCState.Claimed)
+        case (_, _) => fail()
+      }
+    }
+  }
+
+  private def verifyingMatchingOracleSigs(
+      statusA: Claimed,
+      statusB: RemoteClaimed): Boolean = {
+    val outcome = statusB.outcome
+    val numSigs = outcome match {
+      case EnumOutcome(outcome) =>
+        throw new RuntimeException(s"Unexpected outcome type, got $outcome")
+      case UnsignedNumericOutcome(digits) => digits.size
+    }
+
+    val aggR = statusA.oracleSigs
+      .take(numSigs)
+      .map(_.rx.publicKey)
+      .reduce(_.add(_))
+      .schnorrNonce
+
+    val aggS = statusA.oracleSigs
+      .take(numSigs)
+      .map(_.sig)
+      .reduce(_.add(_))
+
+    val aggregateSignature =
+      SchnorrDigitalSignature(aggR, aggS)
+    aggregateSignature == statusB.oracleSig
+  }
+}
diff --git a/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/WalletDLCSetupTest.scala b/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/WalletDLCSetupTest.scala
new file mode 100644
index 0000000000..4e6442041e
--- /dev/null
+++ b/dlc-wallet-test/src/test/scala/org/bitcoins/dlc/wallet/WalletDLCSetupTest.scala
@@ -0,0 +1,455 @@
+package org.bitcoins.dlc.wallet
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc._
+import org.bitcoins.core.currency.Satoshis
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto._
+import org.bitcoins.testkit.wallet.DLCWalletUtil._
+import org.bitcoins.testkit.wallet.FundWalletUtil.FundedDLCWallet
+import org.bitcoins.testkit.wallet.{BitcoinSDualWalletTest, DLCWalletUtil}
+import org.scalatest.{Assertion, FutureOutcome}
+
+import scala.concurrent.Future
+
+class WalletDLCSetupTest extends BitcoinSDualWalletTest {
+  type FixtureParam = (FundedDLCWallet, FundedDLCWallet)
+
+  override def withFixture(test: OneArgAsyncTest): FutureOutcome = {
+    withDualFundedDLCWallets(test)
+  }
+
+  behavior of "DLCWallet"
+
+  def testNegotiate(
+      fundedDLCWallets: (FundedDLCWallet, FundedDLCWallet),
+      offerData: DLCOffer): Future[Assertion] = {
+    val walletA = fundedDLCWallets._1.wallet
+    val walletB = fundedDLCWallets._2.wallet
+
+    for {
+      offer <- walletA.createDLCOffer(
+        offerData.oracleInfo,
+        offerData.contractInfo,
+        offerData.totalCollateral,
+        Some(offerData.feeRate),
+        offerData.timeouts.contractMaturity.toUInt32,
+        offerData.timeouts.contractTimeout.toUInt32
+      )
+      paramHash = offer.paramHash
+      dlcA1Opt <- walletA.dlcDAO.read(paramHash)
+      find1 <- walletA.findDLC(paramHash)
+      _ = {
+        assert(dlcA1Opt.isDefined)
+        assert(find1.isDefined)
+        assert(dlcA1Opt.get.state == DLCState.Offered)
+        assert(offer.oracleInfo == offerData.oracleInfo)
+        assert(offer.contractInfo == offerData.contractInfo)
+        assert(offer.totalCollateral == offerData.totalCollateral)
+        assert(offer.feeRate == offerData.feeRate)
+        assert(offer.timeouts == offerData.timeouts)
+        assert(offer.fundingInputs.nonEmpty)
+        assert(offer.changeAddress.value.nonEmpty)
+      }
+
+      accept <- walletB.acceptDLCOffer(offer)
+      dlcB1Opt <- walletB.dlcDAO.read(paramHash)
+      _ = {
+        assert(dlcB1Opt.isDefined)
+        assert(dlcB1Opt.get.state == DLCState.Accepted)
+        assert(accept.fundingInputs.nonEmpty)
+        assert(
+          accept.fundingInputs
+            .map(_.output.value)
+            .sum >= accept.totalCollateral)
+        assert(
+          accept.totalCollateral == offer.contractInfo.max - offer.totalCollateral)
+        assert(accept.changeAddress.value.nonEmpty)
+      }
+
+      sign <- walletA.signDLC(accept)
+      dlcA2Opt <- walletA.dlcDAO.read(paramHash)
+      _ = {
+        assert(dlcA2Opt.isDefined)
+        assert(dlcA2Opt.get.state == DLCState.Signed)
+        assert(sign.fundingSigs.length == offerData.fundingInputs.size)
+      }
+
+      dlcDb <- walletB.addDLCSigs(sign)
+      _ = assert(dlcDb.state == DLCState.Signed)
+      outcomeSigs <- walletB.dlcSigsDAO.findByParamHash(offer.paramHash)
+
+      refundSigsA <-
+        walletA.dlcRefundSigDAO
+          .findByParamHash(paramHash)
+          .map(_.map(_.refundSig))
+      refundSigsB <-
+        walletB.dlcRefundSigDAO
+          .findByParamHash(paramHash)
+          .map(_.map(_.refundSig))
+
+      walletAChange <- walletA.addressDAO.read(offer.changeAddress)
+      walletAFinal <- walletA.addressDAO.read(offer.pubKeys.payoutAddress)
+
+      walletBChange <- walletB.addressDAO.read(accept.changeAddress)
+      walletBFinal <- walletB.addressDAO.read(accept.pubKeys.payoutAddress)
+
+    } yield {
+      assert(dlcDb.contractIdOpt.get == sign.contractId)
+
+      assert(refundSigsA.size == 2)
+      assert(refundSigsA.forall(refundSigsB.contains))
+
+      assert(sign.cetSigs.outcomeSigs.forall(sig =>
+        outcomeSigs.exists(dbSig => (dbSig.outcome, dbSig.signature) == sig)))
+
+      // Test that the Addresses are in the wallet's database
+      assert(walletAChange.isDefined)
+      assert(walletAFinal.isDefined)
+      assert(walletBChange.isDefined)
+      assert(walletBFinal.isDefined)
+    }
+  }
+
+  it must "correctly negotiate a dlc" in {
+    fundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      testNegotiate(fundedDLCWallets, DLCWalletUtil.sampleDLCOffer)
+  }
+
+  it must "correctly negotiate a dlc with a multi-nonce oracle info" in {
+    fundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      testNegotiate(fundedDLCWallets, DLCWalletUtil.sampleMultiNonceDLCOffer)
+  }
+
+  it must "correctly negotiate a dlc using TLVs" in {
+    fundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      val walletA = fundedDLCWallets._1.wallet
+      val walletB = fundedDLCWallets._2.wallet
+
+      val offerData = DLCWalletUtil.sampleDLCOffer
+
+      for {
+        offer <- walletA.createDLCOffer(
+          offerData.oracleInfo,
+          offerData.contractInfo.toTLV,
+          offerData.totalCollateral,
+          Some(offerData.feeRate),
+          offerData.timeouts.contractMaturity.toUInt32,
+          offerData.timeouts.contractTimeout.toUInt32
+        )
+        paramHash = offer.paramHash
+        dlcA1Opt <- walletA.dlcDAO.read(paramHash)
+        _ = {
+          assert(dlcA1Opt.isDefined)
+          assert(dlcA1Opt.get.state == DLCState.Offered)
+          assert(offer.oracleInfo == offerData.oracleInfo)
+          assert(offer.contractInfo == offerData.contractInfo)
+          assert(offer.totalCollateral == offerData.totalCollateral)
+          assert(offer.feeRate == offerData.feeRate)
+          assert(offer.timeouts == offerData.timeouts)
+          assert(offer.fundingInputs.nonEmpty)
+          assert(offer.changeAddress.value.nonEmpty)
+        }
+
+        accept <- walletB.acceptDLCOffer(offer.toTLV)
+        dlcB1Opt <- walletB.dlcDAO.read(paramHash)
+        _ = {
+          assert(dlcB1Opt.isDefined)
+          assert(dlcB1Opt.get.state == DLCState.Accepted)
+          assert(accept.fundingInputs.nonEmpty)
+          assert(
+            accept.fundingInputs
+              .map(_.output.value)
+              .sum >= accept.totalCollateral)
+          assert(
+            accept.totalCollateral == offer.contractInfo.max - offer.totalCollateral)
+          assert(accept.changeAddress.value.nonEmpty)
+        }
+
+        sign <- walletA.signDLC(accept.toTLV)
+        dlcA2Opt <- walletA.dlcDAO.read(paramHash)
+        _ = {
+          assert(dlcA2Opt.isDefined)
+          assert(dlcA2Opt.get.state == DLCState.Signed)
+          assert(sign.fundingSigs.length == offerData.fundingInputs.size)
+        }
+
+        dlcDb <- walletB.addDLCSigs(sign.toTLV)
+        _ = assert(dlcDb.state == DLCState.Signed)
+        outcomeSigs <- walletB.dlcSigsDAO.findByParamHash(offer.paramHash)
+
+        refundSigsA <-
+          walletA.dlcRefundSigDAO
+            .findByParamHash(paramHash)
+            .map(_.map(_.refundSig))
+        refundSigsB <-
+          walletB.dlcRefundSigDAO
+            .findByParamHash(paramHash)
+            .map(_.map(_.refundSig))
+
+        walletAChange <- walletA.addressDAO.read(offer.changeAddress)
+        walletAFinal <- walletA.addressDAO.read(offer.pubKeys.payoutAddress)
+
+        walletBChange <- walletB.addressDAO.read(accept.changeAddress)
+        walletBFinal <- walletB.addressDAO.read(accept.pubKeys.payoutAddress)
+
+      } yield {
+        assert(dlcDb.contractIdOpt.get == sign.contractId)
+
+        assert(refundSigsA.size == 2)
+        assert(refundSigsA.forall(refundSigsB.contains))
+
+        assert(sign.cetSigs.outcomeSigs.forall(sig =>
+          outcomeSigs.exists(dbSig => (dbSig.outcome, dbSig.signature) == sig)))
+
+        // Test that the Addresses are in the wallet's database
+        assert(walletAChange.isDefined)
+        assert(walletAFinal.isDefined)
+        assert(walletBChange.isDefined)
+        assert(walletBFinal.isDefined)
+      }
+  }
+
+  def getDLCReadyToAddSigs(
+      walletA: DLCWallet,
+      walletB: DLCWallet,
+      offerData: DLCOffer = DLCWalletUtil.sampleDLCOffer): Future[DLCSign] = {
+    for {
+      accept <- getDLCReadyToSign(walletA, walletB, offerData)
+      sign <- walletA.signDLC(accept)
+    } yield sign
+  }
+
+  def getDLCReadyToSign(
+      walletA: DLCWallet,
+      walletB: DLCWallet,
+      offerData: DLCOffer = DLCWalletUtil.sampleDLCOffer): Future[DLCAccept] = {
+    for {
+      offer <- walletA.createDLCOffer(
+        offerData.oracleInfo,
+        offerData.contractInfo,
+        offerData.totalCollateral,
+        Some(offerData.feeRate),
+        offerData.timeouts.contractMaturity.toUInt32,
+        offerData.timeouts.contractTimeout.toUInt32
+      )
+
+      accept <- walletB.acceptDLCOffer(offer)
+    } yield accept
+  }
+
+  def testDLCSignVerification(
+      walletA: DLCWallet,
+      walletB: DLCWallet,
+      makeDLCSignInvalid: DLCSign => DLCSign): Future[Assertion] = {
+    val failedAddSigsF = for {
+      sign <- getDLCReadyToAddSigs(walletA, walletB)
+      invalidSign = makeDLCSignInvalid(sign)
+      dlcDb <- walletB.addDLCSigs(invalidSign)
+    } yield dlcDb
+
+    recoverToSucceededIf[IllegalArgumentException](failedAddSigsF)
+  }
+
+  def testDLCAcceptVerification(
+      walletA: DLCWallet,
+      walletB: DLCWallet,
+      makeDLCAcceptInvalid: DLCAccept => DLCAccept): Future[Assertion] = {
+    val failedAddSigsF = for {
+      accept <- getDLCReadyToSign(walletA, walletB)
+      invalidSign = makeDLCAcceptInvalid(accept)
+      dlcDb <- walletA.signDLC(invalidSign)
+    } yield dlcDb
+
+    recoverToSucceededIf[IllegalArgumentException](failedAddSigsF)
+  }
+
+  it must "fail to add dlc funding sigs that are invalid" in {
+    FundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      val walletA = FundedDLCWallets._1.wallet
+      val walletB = FundedDLCWallets._2.wallet
+
+      testDLCSignVerification(
+        walletA,
+        walletB,
+        (sign: DLCSign) =>
+          sign.copy(fundingSigs = DLCWalletUtil.dummyFundingSignatures))
+  }
+
+  it must "fail to add dlc cet sigs that are invalid" in {
+    FundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      val walletA = FundedDLCWallets._1.wallet
+      val walletB = FundedDLCWallets._2.wallet
+
+      testDLCSignVerification(
+        walletA,
+        walletB,
+        (sign: DLCSign) =>
+          sign.copy(
+            cetSigs = CETSignatures(DLCWalletUtil.dummyOutcomeSigs,
+                                    sign.cetSigs.refundSig)))
+  }
+
+  it must "fail to add an invalid dlc refund sig" in {
+    FundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      val walletA = FundedDLCWallets._1.wallet
+      val walletB = FundedDLCWallets._2.wallet
+
+      testDLCSignVerification(
+        walletA,
+        walletB,
+        (sign: DLCSign) =>
+          sign.copy(
+            cetSigs = CETSignatures(sign.cetSigs.outcomeSigs,
+                                    DLCWalletUtil.dummyPartialSig)))
+  }
+
+  it must "fail to sign dlc with cet sigs that are invalid" in {
+    FundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      val walletA = FundedDLCWallets._1.wallet
+      val walletB = FundedDLCWallets._2.wallet
+
+      testDLCAcceptVerification(
+        walletA,
+        walletB,
+        (accept: DLCAccept) =>
+          accept.copy(
+            cetSigs = CETSignatures(DLCWalletUtil.dummyOutcomeSigs,
+                                    accept.cetSigs.refundSig)))
+  }
+
+  it must "fail to sign dlc with an invalid refund sig" in {
+    FundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      val walletA = FundedDLCWallets._1.wallet
+      val walletB = FundedDLCWallets._2.wallet
+
+      testDLCAcceptVerification(
+        walletA,
+        walletB,
+        (accept: DLCAccept) =>
+          accept.copy(
+            cetSigs = CETSignatures(accept.cetSigs.outcomeSigs,
+                                    DLCWalletUtil.dummyPartialSig)))
+  }
+
+  it must "setup and execute with lloyd's example" in {
+    FundedDLCWallets: (FundedDLCWallet, FundedDLCWallet) =>
+      val walletA = FundedDLCWallets._1.wallet
+      val walletB = FundedDLCWallets._2.wallet
+
+      val winStr = "Democrat_win"
+      val loseStr = "Republican_win"
+      val drawStr = "other"
+
+      val betSize = 10000
+
+      lazy val contractInfo: ContractInfo =
+        SingleNonceContractInfo.fromStringVec(
+          Vector(winStr -> Satoshis(betSize),
+                 loseStr -> Satoshis.zero,
+                 drawStr -> Satoshis(betSize / 2)))
+
+      val oraclePubKey = SchnorrPublicKey(
+        "156c7d1c7922f0aa1168d9e21ac77ea88bbbe05e24e70a08bbe0519778f2e5da")
+      val oracleNonce = SchnorrNonce(
+        "ea3a68d8749b81682513b0479418d289d17e24d4820df2ce979f1a56a63ca525")
+      val attestation = FieldElement(
+        "77a5aabd716936411bbe19219bd0b261fae8f0524367268feb264e0a3b215766")
+
+      val oracleInfo = SingleNonceOracleInfo(oraclePubKey, oracleNonce)
+
+      val offerData = DLCOffer(
+        OracleAndContractInfo(oracleInfo, contractInfo),
+        dummyDLCKeys,
+        Satoshis(5000),
+        Vector(dummyFundingInputs.head),
+        dummyAddress,
+        SatoshisPerVirtualByte(Satoshis(3)),
+        dummyTimeouts
+      )
+
+      val oracleSig = SchnorrDigitalSignature(oracleNonce, attestation)
+
+      val paramHash = DLCMessage.calcParamHash(offerData.oracleInfo,
+                                               offerData.contractInfo,
+                                               offerData.timeouts)
+
+      for {
+        offer <- walletA.createDLCOffer(
+          offerData.oracleInfo,
+          offerData.contractInfo,
+          offerData.totalCollateral,
+          Some(offerData.feeRate),
+          offerData.timeouts.contractMaturity.toUInt32,
+          offerData.timeouts.contractTimeout.toUInt32
+        )
+        _ = {
+          assert(offer.oracleInfo == offerData.oracleInfo)
+          assert(offer.contractInfo == offerData.contractInfo)
+          assert(offer.totalCollateral == offerData.totalCollateral)
+          assert(offer.feeRate == offerData.feeRate)
+          assert(offer.timeouts == offerData.timeouts)
+          assert(offer.fundingInputs.nonEmpty)
+          assert(offer.changeAddress.value.nonEmpty)
+        }
+
+        accept <- walletB.acceptDLCOffer(offer)
+        _ = {
+          assert(accept.fundingInputs.nonEmpty)
+          assert(
+            accept.totalCollateral == offer.contractInfo.max - offer.totalCollateral)
+          assert(accept.changeAddress.value.nonEmpty)
+        }
+
+        sign <- walletA.signDLC(accept)
+        _ = {
+          assert(sign.fundingSigs.length == offerData.fundingInputs.size)
+        }
+
+        dlcDb <- walletB.addDLCSigs(sign)
+        outcomeSigs <- walletB.dlcSigsDAO.findByParamHash(offer.paramHash)
+
+        refundSigsA <-
+          walletA.dlcRefundSigDAO
+            .findByParamHash(paramHash)
+            .map(_.map(_.refundSig))
+        refundSigsB <-
+          walletB.dlcRefundSigDAO
+            .findByParamHash(paramHash)
+            .map(_.map(_.refundSig))
+
+        walletAChange <- walletA.addressDAO.read(offer.changeAddress)
+        walletAFinal <- walletA.addressDAO.read(offer.pubKeys.payoutAddress)
+
+        walletBChange <- walletB.addressDAO.read(accept.changeAddress)
+        walletBFinal <- walletB.addressDAO.read(accept.pubKeys.payoutAddress)
+
+        _ = {
+          assert(dlcDb.contractIdOpt.get == sign.contractId)
+
+          assert(refundSigsA.size == 2)
+          assert(refundSigsA.forall(refundSigsB.contains))
+
+          assert(sign.cetSigs.outcomeSigs.forall(sig =>
+            outcomeSigs.exists(dbSig =>
+              (dbSig.outcome, dbSig.signature) == sig)))
+          // Test that the Addresses are in the wallet's database
+          assert(walletAChange.isDefined)
+          assert(walletAFinal.isDefined)
+          assert(walletBChange.isDefined)
+          assert(walletBFinal.isDefined)
+        }
+
+        tx <- walletB.broadcastDLCFundingTx(sign.contractId)
+        _ <- walletA.processTransaction(tx, None)
+
+        func =
+          (wallet: DLCWallet) => wallet.executeDLC(sign.contractId, oracleSig)
+        result <- dlcExecutionTest(dlcA = walletA,
+                                   dlcB = walletB,
+                                   asInitiator = true,
+                                   func = func,
+                                   expectedOutputs = 1)
+      } yield assert(result)
+  }
+}
diff --git a/dlc-wallet/src/main/resources/postgresql/dlc/migration/V1__dlc_db_baseline.sql b/dlc-wallet/src/main/resources/postgresql/dlc/migration/V1__dlc_db_baseline.sql
new file mode 100644
index 0000000000..c493e08897
--- /dev/null
+++ b/dlc-wallet/src/main/resources/postgresql/dlc/migration/V1__dlc_db_baseline.sql
@@ -0,0 +1,93 @@
+CREATE TABLE "wallet_dlcs"
+(
+    "param_hash"       TEXT    NOT NULL UNIQUE,
+    "temp_contract_id" TEXT    NOT NULL UNIQUE,
+    "contract_id"      TEXT UNIQUE,
+    "state"            TEXT    NOT NULL,
+    "is_initiator"     BOOLEAN NOT NULL,
+    "account"          TEXT    NOT NULL,
+    "key_index"        INTEGER NOT NULL,
+    "oracle_sigs"      TEXT,
+    "funding_outpoint" TEXT,
+    "funding_tx_id"    TEXT,
+    "closing_tx_id"    TEXT,
+    constraint "pk_dlc" primary key ("param_hash")
+);
+CREATE INDEX "wallet_dlcs_param_hash_index" on "wallet_dlcs" ("param_hash");
+
+CREATE TABLE "wallet_dlc_offers"
+(
+    "param_hash"        VARCHAR(254) NOT NULL UNIQUE,
+    "temp_contract_id"  TEXT         NOT NULL UNIQUE,
+    "oracle_info_tlv"   TEXT         NOT NULL,
+    "contract_info"     TEXT         NOT NULL,
+    "contract_maturity" TEXT         NOT NULL,
+    "contract_timeout"  TEXT         NOT NULL,
+    "funding_key"       TEXT         NOT NULL,
+    "payout_address"    TEXT         NOT NULL,
+    "total_collateral"  INTEGER      NOT NULL,
+    "fee_rate"          TEXT,
+    "change_address"    TEXT         NOT NULL,
+    constraint "pk_dlc_offer" primary key ("param_hash"),
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash"),
+    constraint "fk_temp_contract_id" foreign key ("temp_contract_id") references "wallet_dlcs" ("temp_contract_id") on update NO ACTION on delete NO ACTION
+);
+CREATE INDEX "wallet_dlc_offers_param_hash_index" on "wallet_dlc_offers" ("param_hash");
+
+CREATE TABLE "wallet_dlc_accepts"
+(
+    "param_hash"       VARCHAR(254) NOT NULL UNIQUE,
+    "temp_contract_id" TEXT         NOT NULL UNIQUE,
+    "funding_key"      TEXT         NOT NULL,
+    "payout_address"   TEXT         NOT NULL,
+    "total_collateral" INTEGER      NOT NULL,
+    "change_address"   TEXT         NOT NULL,
+    constraint "pk_dlc_accept" primary key ("param_hash"),
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash"),
+    constraint "fk_temp_contract_id" foreign key ("temp_contract_id") references "wallet_dlcs" ("temp_contract_id") on update NO ACTION on delete NO ACTION
+);
+CREATE INDEX "wallet_dlc_accepts_param_hash_index" on "wallet_dlc_accepts" ("param_hash");
+
+CREATE TABLE "wallet_dlc_funding_inputs"
+(
+    "param_hash"         VARCHAR(254) NOT NULL UNIQUE,
+    "is_initiator"       BOOLEAN      NOT NULL,
+    "out_point"          TEXT         NOT NULL UNIQUE,
+    "output"             TEXT         NOT NULL,
+    "redeem_script_opt"  TEXT,
+    "witness_script_opt" TEXT,
+    constraint "pk_dlc_input" primary key ("out_point"),
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash") on update NO ACTION on delete NO ACTION
+);
+
+CREATE TABLE "wallet_dlc_cet_sigs"
+(
+    "param_hash"   TEXT    NOT NULL,
+    "is_initiator" INTEGER NOT NULL,
+    "outcome"      TEXT    NOT NULL,
+    "signature"    TEXT    NOT NULL,
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash") on update NO ACTION on delete NO ACTION
+);
+
+CREATE TABLE "wallet_dlc_refund_sigs"
+(
+    "param_hash"   TEXT    NOT NULL,
+    "is_initiator" INTEGER NOT NULL,
+    "refund_sig"   TEXT    NOT NULL,
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash") on update NO ACTION on delete NO ACTION
+);
+CREATE INDEX "wallet_dlc_refund_sigs_param_hash_index" on "wallet_dlc_accepts" ("param_hash");
+
+CREATE TABLE tx_table
+(
+    "txIdBE"         TEXT    NOT NULL,
+    "transaction"    TEXT    NOT NULL,
+    "unsignedTxIdBE" TEXT    NOT NULL,
+    "unsignedTx"     TEXT    NOT NULL,
+    "wTxIdBE"        TEXT,
+    "totalOutput"    BIGINT  NOT NULL,
+    "numInputs"      INTEGER NOT NULL,
+    "numOutputs"     INTEGER NOT NULL,
+    locktime         BIGINT  NOT NULL,
+    constraint pk_tx primary key ("txIdBE")
+);
diff --git a/dlc-wallet/src/main/resources/postgresql/dlc/migration/V2__add_outcome.sql b/dlc-wallet/src/main/resources/postgresql/dlc/migration/V2__add_outcome.sql
new file mode 100644
index 0000000000..bddaab052f
--- /dev/null
+++ b/dlc-wallet/src/main/resources/postgresql/dlc/migration/V2__add_outcome.sql
@@ -0,0 +1 @@
+ALTER TABLE "wallet_dlcs" ADD COLUMN "outcome" TEXT;
\ No newline at end of file
diff --git a/dlc-wallet/src/main/resources/sqlite/dlc/migration/V1__dlc_db_baseline.sql b/dlc-wallet/src/main/resources/sqlite/dlc/migration/V1__dlc_db_baseline.sql
new file mode 100644
index 0000000000..1d34745db9
--- /dev/null
+++ b/dlc-wallet/src/main/resources/sqlite/dlc/migration/V1__dlc_db_baseline.sql
@@ -0,0 +1,86 @@
+CREATE TABLE "wallet_dlcs"
+(
+    "param_hash"       VARCHAR(254) NOT NULL UNIQUE,
+    "temp_contract_id" VARCHAR(254) NOT NULL UNIQUE,
+    "contract_id"      VARCHAR(254) UNIQUE,
+    "state"            VARCHAR(254) NOT NULL,
+    "is_initiator"     INTEGER      NOT NULL,
+    "account"          VARCHAR(254) NOT NULL,
+    "key_index"        INTEGER      NOT NULL,
+    "oracle_sigs"      VARCHAR(254),
+    "funding_outpoint" VARCHAR(254),
+    "funding_tx_id"    VARCHAR(254),
+    "closing_tx_id"    VARCHAR(254)
+);
+CREATE INDEX "wallet_dlcs_param_hash_index" on "wallet_dlcs" ("param_hash");
+
+CREATE TABLE "wallet_dlc_offers"
+(
+    "param_hash"        VARCHAR(254) NOT NULL UNIQUE,
+    "temp_contract_id"  VARCHAR(254) NOT NULL UNIQUE,
+    "oracle_info_tlv"   VARCHAR(254) NOT NULL,
+    "contract_info"     VARCHAR(254) NOT NULL,
+    "contract_maturity" VARCHAR(254) NOT NULL,
+    "contract_timeout"  VARCHAR(254) NOT NULL,
+    "funding_key"       VARCHAR(254) NOT NULL,
+    "payout_address"    VARCHAR(254) NOT NULL,
+    "total_collateral"  INTEGER      NOT NULL,
+    "fee_rate"          VARCHAR(254),
+    "change_address"    VARCHAR(254) NOT NULL,
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash") on update NO ACTION on delete NO ACTION
+);
+CREATE INDEX "wallet_dlc_offers_param_hash_index" on "wallet_dlc_offers" ("param_hash");
+
+CREATE TABLE "wallet_dlc_accepts"
+(
+    "param_hash"       VARCHAR(254) NOT NULL UNIQUE,
+    "temp_contract_id" VARCHAR(254) NOT NULL UNIQUE,
+    "funding_key"      VARCHAR(254) NOT NULL,
+    "payout_address"   VARCHAR(254) NOT NULL,
+    "total_collateral" INTEGER      NOT NULL,
+    "change_address"   VARCHAR(254) NOT NULL,
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash") on update NO ACTION on delete NO ACTION
+);
+CREATE INDEX "wallet_dlc_accepts_param_hash_index" on "wallet_dlc_accepts" ("param_hash");
+
+CREATE TABLE "wallet_dlc_funding_inputs"
+(
+    "param_hash"         VARCHAR(254) NOT NULL,
+    "is_initiator"       INTEGER      NOT NULL,
+    "out_point"          VARCHAR(254) NOT NULL UNIQUE,
+    "output"             VARCHAR(254) NOT NULL,
+    "redeem_script_opt"  VARCHAR(254),
+    "witness_script_opt" VARCHAR(254),
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash") on update NO ACTION on delete NO ACTION
+);
+
+CREATE TABLE "wallet_dlc_cet_sigs"
+(
+    "param_hash"   VARCHAR(254) NOT NULL,
+    "is_initiator" INTEGER      NOT NULL,
+    "outcome"      VARCHAR(254) NOT NULL,
+    "signature"    VARCHAR(254) NOT NULL,
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash") on update NO ACTION on delete NO ACTION
+);
+
+CREATE TABLE "wallet_dlc_refund_sigs"
+(
+    "param_hash"   VARCHAR(254) NOT NULL,
+    "is_initiator" INTEGER      NOT NULL,
+    "refund_sig"   VARCHAR(254) NOT NULL,
+    constraint "fk_param_hash" foreign key ("param_hash") references "wallet_dlcs" ("param_hash") on update NO ACTION on delete NO ACTION
+);
+CREATE INDEX "wallet_dlc_refund_sigs_param_hash_index" on "wallet_dlc_accepts" ("param_hash");
+
+CREATE TABLE "dlc_remote_tx_table"
+(
+    "txIdBE"         VARCHAR(254) NOT NULL PRIMARY KEY,
+    "transaction"    VARCHAR(254) NOT NULL,
+    "unsignedTxIdBE" VARCHAR(254) NOT NULL,
+    "unsignedTx"     VARCHAR(254) NOT NULL,
+    "wTxIdBE"        VARCHAR(254),
+    "totalOutput"    INTEGER      NOT NULL,
+    "numInputs"      INTEGER      NOT NULL,
+    "numOutputs"     INTEGER      NOT NULL,
+    "locktime"       INTEGER      NOT NULL
+);
diff --git a/dlc-wallet/src/main/resources/sqlite/dlc/migration/V2__add_outcome.sql b/dlc-wallet/src/main/resources/sqlite/dlc/migration/V2__add_outcome.sql
new file mode 100644
index 0000000000..bddaab052f
--- /dev/null
+++ b/dlc-wallet/src/main/resources/sqlite/dlc/migration/V2__add_outcome.sql
@@ -0,0 +1 @@
+ALTER TABLE "wallet_dlcs" ADD COLUMN "outcome" TEXT;
\ No newline at end of file
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCAppConfig.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCAppConfig.scala
new file mode 100644
index 0000000000..07a18f3d7f
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCAppConfig.scala
@@ -0,0 +1,129 @@
+package org.bitcoins.dlc.wallet
+
+import java.nio.file.{Files, Path}
+
+import com.typesafe.config.Config
+import org.bitcoins.core.api.chain.ChainQueryApi
+import org.bitcoins.core.api.feeprovider.FeeRateApi
+import org.bitcoins.core.api.node.NodeApi
+import org.bitcoins.core.util.FutureUtil
+import org.bitcoins.core.wallet.keymanagement.KeyManagerInitializeError
+import org.bitcoins.db.{AppConfig, AppConfigFactory, JdbcProfileComponent}
+import org.bitcoins.keymanager.bip39.{BIP39KeyManager, BIP39LockedKeyManager}
+import org.bitcoins.wallet.config.WalletAppConfig
+import org.bitcoins.wallet.{Wallet, WalletLogger}
+
+import scala.concurrent.{ExecutionContext, Future}
+
+/** Configuration for the Bitcoin-S wallet
+  *
+  * @param directory The data directory of the wallet
+  * @param conf Optional sequence of configuration overrides
+  */
+case class DLCAppConfig(private val directory: Path, private val conf: Config*)(
+    implicit override val ec: ExecutionContext)
+    extends AppConfig
+    with DLCDbManagement
+    with JdbcProfileComponent[DLCAppConfig] {
+  override protected[bitcoins] def configOverrides: List[Config] = conf.toList
+  override protected[bitcoins] def moduleName: String = "dlc"
+  override protected[bitcoins] type ConfigType = DLCAppConfig
+
+  override protected[bitcoins] def newConfigOfType(
+      configs: Seq[Config]): DLCAppConfig =
+    DLCAppConfig(directory, configs: _*)
+
+  protected[bitcoins] def baseDatadir: Path = directory
+
+  override def appConfig: DLCAppConfig = this
+
+  override def start(): Future[Unit] = {
+    logger.debug(s"Initializing dlc setup")
+
+    if (Files.notExists(datadir)) {
+      Files.createDirectories(datadir)
+    }
+
+    val numMigrations = {
+      migrate()
+    }
+
+    logger.info(s"Applied $numMigrations to the dlc project")
+
+    FutureUtil.unit
+  }
+
+  def createDLCWallet(
+      nodeApi: NodeApi,
+      chainQueryApi: ChainQueryApi,
+      feeRateApi: FeeRateApi)(implicit
+      walletConf: WalletAppConfig,
+      ec: ExecutionContext): Future[DLCWallet] = {
+    DLCAppConfig.createDLCWallet(nodeApi = nodeApi,
+                                 chainQueryApi = chainQueryApi,
+                                 feeRateApi = feeRateApi)(walletConf, this, ec)
+  }
+}
+
+object DLCAppConfig extends AppConfigFactory[DLCAppConfig] with WalletLogger {
+
+  /** Constructs a wallet configuration from the default Bitcoin-S
+    * data directory and given list of configuration overrides.
+    */
+  override def fromDatadir(datadir: Path, confs: Vector[Config])(implicit
+      ec: ExecutionContext): DLCAppConfig =
+    DLCAppConfig(datadir, confs: _*)
+
+  /** Creates a wallet based on the given [[WalletAppConfig]] */
+  def createDLCWallet(
+      nodeApi: NodeApi,
+      chainQueryApi: ChainQueryApi,
+      feeRateApi: FeeRateApi)(implicit
+      walletConf: WalletAppConfig,
+      dlcConf: DLCAppConfig,
+      ec: ExecutionContext): Future[DLCWallet] = {
+    val aesPasswordOpt = walletConf.aesPasswordOpt
+    val bip39PasswordOpt = walletConf.bip39PasswordOpt
+    walletConf.hasWallet().flatMap { walletExists =>
+      if (walletExists) {
+        logger.info(s"Using pre-existing wallet")
+        // TODO change me when we implement proper password handling
+        BIP39LockedKeyManager.unlock(aesPasswordOpt,
+                                     bip39PasswordOpt,
+                                     walletConf.kmParams) match {
+          case Right(km) =>
+            val wallet =
+              DLCWallet(km, nodeApi, chainQueryApi, feeRateApi, km.creationTime)
+            Future.successful(wallet)
+          case Left(err) =>
+            sys.error(s"Error initializing key manager, err=${err}")
+        }
+      } else {
+        logger.info(s"Initializing key manager")
+        val keyManagerE: Either[KeyManagerInitializeError, BIP39KeyManager] =
+          BIP39KeyManager.initialize(aesPasswordOpt = aesPasswordOpt,
+                                     kmParams = walletConf.kmParams,
+                                     bip39PasswordOpt = bip39PasswordOpt)
+
+        val keyManager = keyManagerE match {
+          case Right(keyManager) => keyManager
+          case Left(err) =>
+            sys.error(s"Error initializing key manager, err=${err}")
+        }
+
+        logger.info(s"Creating new wallet")
+        val unInitializedWallet =
+          DLCWallet(keyManager,
+                    nodeApi,
+                    chainQueryApi,
+                    feeRateApi,
+                    keyManager.creationTime)
+
+        Wallet
+          .initialize(wallet = unInitializedWallet,
+                      bip39PasswordOpt = bip39PasswordOpt)
+          .map(_.asInstanceOf[DLCWallet])
+      }
+    }
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCDbManagement.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCDbManagement.scala
new file mode 100644
index 0000000000..a4d96a25a1
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCDbManagement.scala
@@ -0,0 +1,57 @@
+package org.bitcoins.dlc.wallet
+
+import org.bitcoins.db.{DbManagement, JdbcProfileComponent}
+import org.bitcoins.dlc.wallet.models._
+
+import scala.concurrent.ExecutionContext
+
+trait DLCDbManagement extends DbManagement {
+  _: JdbcProfileComponent[DLCAppConfig] =>
+
+  import profile.api._
+
+  def ec: ExecutionContext
+
+  private lazy val dlcTable: TableQuery[Table[_]] = {
+    DLCDAO()(ec, appConfig).table
+  }
+
+  private lazy val dlcOfferTable: TableQuery[Table[_]] = {
+    DLCOfferDAO()(ec, appConfig).table
+  }
+
+  private lazy val dlcAcceptTable: TableQuery[Table[_]] = {
+    DLCAcceptDAO()(ec, appConfig).table
+  }
+
+  private lazy val dlcFundingInputsTable: TableQuery[Table[_]] = {
+    DLCFundingInputDAO()(ec, appConfig).table
+  }
+
+  private lazy val dlcCETSigTable: TableQuery[Table[_]] = {
+    DLCCETSignatureDAO()(ec, appConfig).table
+  }
+
+  private lazy val dlcRefundSigTable: TableQuery[Table[_]] = {
+    DLCRefundSigDAO()(ec, appConfig).table
+  }
+
+  private lazy val dlcRemoteTxTable: TableQuery[Table[_]] = {
+    DLCRemoteTxDAO()(ec, appConfig).table
+  }
+
+  // Ordering matters here, tables with a foreign key should be listed after
+  // the table that key references
+  override lazy val allTables: List[TableQuery[Table[_]]] = {
+    List(
+      dlcTable,
+      dlcOfferTable,
+      dlcAcceptTable,
+      dlcFundingInputsTable,
+      dlcCETSigTable,
+      dlcRefundSigTable,
+      dlcRemoteTxTable
+    )
+  }
+
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCWallet.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCWallet.scala
new file mode 100644
index 0000000000..255e758726
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCWallet.scala
@@ -0,0 +1,1601 @@
+package org.bitcoins.dlc.wallet
+
+import java.time.Instant
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc.DLCStatus._
+import org.bitcoins.commons.jsonmodels.dlc._
+import org.bitcoins.core.api.chain.ChainQueryApi
+import org.bitcoins.core.api.feeprovider.FeeRateApi
+import org.bitcoins.core.api.node.NodeApi
+import org.bitcoins.core.api.wallet.db._
+import org.bitcoins.core.config.BitcoinNetwork
+import org.bitcoins.core.crypto.ExtPublicKey
+import org.bitcoins.core.currency._
+import org.bitcoins.core.hd.{AddressType, BIP32Path, HDChainType}
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.script._
+import org.bitcoins.core.protocol.tlv._
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.protocol.{Bech32Address, BlockStamp}
+import org.bitcoins.core.util.FutureUtil
+import org.bitcoins.core.wallet.fee.{FeeUnit, SatoshisPerVirtualByte}
+import org.bitcoins.core.wallet.utxo._
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import org.bitcoins.dlc.execution._
+import org.bitcoins.dlc.sign.DLCTxSigner
+import org.bitcoins.dlc.verify.DLCSignatureVerifier
+import org.bitcoins.dlc.wallet.models._
+import org.bitcoins.keymanager.bip39.BIP39KeyManager
+import org.bitcoins.wallet.config.WalletAppConfig
+import org.bitcoins.wallet.{Wallet, WalletLogger}
+import scodec.bits.ByteVector
+
+import scala.concurrent.{ExecutionContext, Future}
+
+abstract class DLCWallet extends Wallet with AnyDLCHDWalletApi {
+
+  implicit val dlcConfig: DLCAppConfig
+
+  private[bitcoins] val dlcOfferDAO: DLCOfferDAO = DLCOfferDAO()
+  private[bitcoins] val dlcAcceptDAO: DLCAcceptDAO = DLCAcceptDAO()
+  private[bitcoins] val dlcDAO: DLCDAO = DLCDAO()
+  private[bitcoins] val dlcInputsDAO: DLCFundingInputDAO = DLCFundingInputDAO()
+  private[bitcoins] val dlcSigsDAO: DLCCETSignatureDAO = DLCCETSignatureDAO()
+  private[bitcoins] val dlcRefundSigDAO: DLCRefundSigDAO = DLCRefundSigDAO()
+  private[bitcoins] val remoteTxDAO: DLCRemoteTxDAO = DLCRemoteTxDAO()
+
+  private def calcContractId(
+      offer: DLCOffer,
+      accept: DLCAccept): Future[ByteVector] = {
+    val builder = DLCTxBuilder(offer, accept.withoutSigs)
+    builder.calcContractId
+  }
+
+  private def updateDLCContractIds(
+      offer: DLCOffer,
+      accept: DLCAccept): Future[DLCDb] = {
+    require(accept.tempContractId == offer.tempContractId,
+            "Offer and Accept have differing tempContractIds!")
+    val paramHash = offer.paramHash
+    for {
+      dlcOpt <- dlcDAO.read(paramHash)
+      dlcDb <- dlcOpt match {
+        case Some(dlc) => Future.successful(dlc)
+        case None =>
+          Future.failed(
+            new IllegalArgumentException(
+              s"No DLCDb found with paramHash ${paramHash.hex}"))
+      }
+      contractId <- calcContractId(offer, accept)
+
+      newDLCDb = dlcDb.copy(contractIdOpt = Some(contractId))
+      _ = logger.debug(s"Updating DLC contract Ids")
+      updated <- dlcDAO.update(newDLCDb)
+    } yield updated
+  }
+
+  private def updateDLCState(
+      contractId: ByteVector,
+      state: DLCState): Future[DLCDb] = {
+    for {
+      dlcOpt <- dlcDAO.findByContractId(contractId)
+      dlcDb <- dlcOpt match {
+        case Some(dlc) => Future.successful(dlc)
+        case None =>
+          Future.failed(
+            new IllegalArgumentException(
+              s"No DLCDb found with contractId ${contractId.toHex}"))
+      }
+      _ = logger.debug(s"Updating DLC (${contractId.toHex}) to state $state")
+      updated <- dlcDAO.update(dlcDb.updateState(state))
+    } yield updated
+  }
+
+  /** Updates the funding outpoint in the DLCDb corresponding to the given contractId */
+  private def updateFundingOutPoint(
+      contractId: ByteVector,
+      outPoint: TransactionOutPoint): Future[DLCDb] = {
+    for {
+      dlcOpt <- dlcDAO.findByContractId(contractId)
+      dlcDb <- dlcOpt match {
+        case Some(dlc) => Future.successful(dlc)
+        case None =>
+          Future.failed(
+            new IllegalArgumentException(
+              s"No DLCDb found with contractId ${contractId.toHex}"))
+      }
+      _ = logger.debug(
+        s"Updating DLC (${contractId.toHex}) funding outpoint to ${outPoint.hex}")
+      updated <- dlcDAO.update(dlcDb.updateFundingOutPoint(outPoint))
+    } yield updated
+  }
+
+  /** Updates the closing txId in the DLCDb corresponding to the given contractId */
+  private def updateClosingTxId(
+      contractId: ByteVector,
+      txId: DoubleSha256DigestBE): Future[DLCDb] = {
+    for {
+      dlcOpt <- dlcDAO.findByContractId(contractId)
+      dlcDb <- dlcOpt match {
+        case Some(dlc) => Future.successful(dlc)
+        case None =>
+          Future.failed(
+            new IllegalArgumentException(
+              s"No DLCDb found with contractId ${contractId.toHex}"))
+      }
+      _ = logger.debug(
+        s"Updating DLC (${contractId.toHex}) closing txId to ${txId.hex}")
+      updated <- dlcDAO.update(dlcDb.copy(closingTxIdOpt = Some(txId)))
+    } yield updated
+  }
+
+  private def updateDLCOracleSigs(
+      contractId: ByteVector,
+      sigs: Vector[SchnorrDigitalSignature]): Future[DLCDb] = {
+    dlcDAO.findByContractId(contractId).flatMap {
+      case Some(dlcDb) =>
+        logger.debug(
+          s"Updating DLC's (${contractId.toHex}) oracle sigs to ${sigs.map(_.hex)}")
+        dlcDAO.update(dlcDb.copy(oracleSigsOpt = Some(sigs)))
+      case None =>
+        Future.failed(
+          new NoSuchElementException(
+            s"No DLC found with that contractId ${contractId.toHex}"))
+    }
+  }
+
+  private def updateDLCOutcome(
+      contractId: ByteVector,
+      outcome: DLCOutcomeType): Future[DLCDb] = {
+    dlcDAO.findByContractId(contractId).flatMap {
+      case Some(dlcDb) =>
+        logger.debug(
+          s"Updating DLC's (${contractId.toHex}) outcome to $outcome")
+        dlcDAO.update(dlcDb.copy(outcomeOpt = Some(outcome)))
+      case None =>
+        Future.failed(
+          new NoSuchElementException(
+            s"No DLC found with that contractId ${contractId.toHex}"))
+    }
+  }
+
+  private def calcDLCPubKeys(
+      xpub: ExtPublicKey,
+      keyIndex: Int): DLCPublicKeys = {
+    val fundingKey =
+      xpub
+        .deriveChildPubKey(BIP32Path.fromString(s"m/0/$keyIndex"))
+        .get
+        .key
+
+    val payoutKey =
+      xpub
+        .deriveChildPubKey(BIP32Path.fromString(s"m/0/${keyIndex + 1}"))
+        .get
+        .key
+
+    networkParameters match {
+      case bitcoinNetwork: BitcoinNetwork =>
+        DLCPublicKeys.fromPubKeys(fundingKey, payoutKey, bitcoinNetwork)
+    }
+  }
+
+  private def writeDLCKeysToAddressDb(
+      account: AccountDb,
+      index: Int): Future[Vector[AddressDb]] = {
+    for {
+      zero <- getAddress(account, HDChainType.External, index)
+      one <- getAddress(account, HDChainType.External, index + 1)
+    } yield {
+      logger.debug(s"Wrote DLC key addresses to database using index $index")
+      Vector(zero, one)
+    }
+  }
+
+  /** Calculates the new state of the DLCDb based on the closing transaction */
+  private def calculateAndSetState(dlcDb: DLCDb): Future[DLCDb] = {
+    (dlcDb.contractIdOpt, dlcDb.closingTxIdOpt) match {
+      case (Some(id), Some(txId)) =>
+        executorAndSetupFromDb(id).flatMap {
+          case (_, setup) =>
+            val updatedF = if (txId == setup.refundTx.txIdBE) {
+              Future.successful(dlcDb.copy(state = DLCState.Refunded))
+            } else if (dlcDb.state == DLCState.Claimed) {
+              Future.successful(dlcDb.copy(state = DLCState.Claimed))
+            } else {
+              val withState = dlcDb.copy(state = DLCState.RemoteClaimed)
+              if (dlcDb.outcomeOpt.isEmpty || dlcDb.oracleSigsOpt.isEmpty) {
+                for {
+                  // update so we can calculate correct DLCStatus
+                  _ <- dlcDAO.update(withState)
+                  withOutcome <- calculateAndSetOutcome(withState)
+                } yield withOutcome
+              } else Future.successful(withState)
+            }
+
+            for {
+              updated <- updatedF
+
+              _ <- {
+                updated.state match {
+                  case DLCState.Claimed | DLCState.RemoteClaimed |
+                      DLCState.Refunded =>
+                    val contractId = updated.contractIdOpt.get.toHex
+                    logger.info(
+                      s"Deleting unneeded DLC signatures for contract $contractId")
+
+                    // Make sure we can safely delete the sigs
+                    // Refunded will not have these set
+                    if (updated.state != DLCState.Refunded) {
+                      require(
+                        updated.outcomeOpt.isDefined && updated.oracleSigsOpt.isDefined,
+                        s"Attempted to delete signatures when no outcome or oracle signature was set, $contractId"
+                      )
+                    }
+                    dlcSigsDAO.deleteByParamHash(updated.paramHash)
+                  case DLCState.Offered | DLCState.Accepted | DLCState.Signed |
+                      DLCState.Broadcasted | DLCState.Confirmed =>
+                    FutureUtil.unit
+                }
+              }
+
+            } yield updated
+        }
+      case (None, None) | (None, Some(_)) | (Some(_), None) =>
+        Future.successful(dlcDb)
+    }
+  }
+
+  private def calculateAndSetOutcome(dlcDb: DLCDb): Future[DLCDb] = {
+    if (dlcDb.state == DLCState.RemoteClaimed && dlcDb.outcomeOpt.isEmpty) {
+      val paramHash = dlcDb.paramHash
+      for {
+        offerDbOpt <- dlcOfferDAO.findByParamHash(paramHash)
+        acceptDbOpt <- dlcAcceptDAO.findByParamHash(paramHash)
+        fundingInputDbs <- dlcInputsDAO.findByParamHash(paramHash)
+        txIds = fundingInputDbs.map(_.outPoint.txIdBE)
+        remotePrevTxs <- remoteTxDAO.findByTxIdBEs(txIds)
+        localPrevTxs <- transactionDAO.findByTxIdBEs(txIds)
+        refundSigDbs <- dlcRefundSigDAO.findByParamHash(paramHash)
+        sigDbs <- dlcSigsDAO.findByParamHash(paramHash)
+
+        cet <-
+          transactionDAO.read(dlcDb.closingTxIdOpt.get).map(_.get.transaction)
+
+        (sig, outcome) = {
+          val offerDb = offerDbOpt.get
+          val prevTxs = (remotePrevTxs ++ localPrevTxs).map(_.transaction)
+          val txs = prevTxs.groupBy(_.txIdBE)
+
+          val isInit = dlcDb.isInitiator
+
+          val fundingInputs = fundingInputDbs.map(input =>
+            input.toFundingInput(txs(input.outPoint.txIdBE).head))
+
+          val offerRefundSigOpt =
+            refundSigDbs.find(_.isInitiator).map(_.refundSig)
+          val acceptRefundSigOpt =
+            refundSigDbs.find(!_.isInitiator).map(_.refundSig)
+
+          val offer = offerDb.toDLCOffer(fundingInputs)
+          val accept = acceptDbOpt
+            .map(
+              _.toDLCAccept(fundingInputs,
+                            sigDbs
+                              .filter(!_.isInitiator)
+                              .map(dbSig => (dbSig.outcome, dbSig.signature)),
+                            acceptRefundSigOpt.get))
+            .get
+
+          val initSigs = sigDbs.filter(_.isInitiator)
+
+          val sign: DLCSign = {
+            val cetSigs =
+              CETSignatures(
+                initSigs.map(dbSig => (dbSig.outcome, dbSig.signature)),
+                offerRefundSigOpt.get)
+
+            val contractId = dlcDb.contractIdOpt.get
+            val fundingSigs =
+              fundingInputDbs
+                .filter(_.isInitiator)
+                .map { input =>
+                  input.witnessScriptOpt match {
+                    case Some(witnessScript) =>
+                      witnessScript match {
+                        case EmptyScriptWitness =>
+                          throw new RuntimeException(
+                            "Script witness cannot be empty")
+                        case witness: ScriptWitnessV0 =>
+                          (input.outPoint, witness)
+                      }
+                    case None =>
+                      throw new RuntimeException("Must be segwit")
+                  }
+                }
+
+            DLCSign(cetSigs, FundingSignatures(fundingSigs), contractId)
+          }
+
+          DLCStatus.calculateOutcomeAndSig(isInit, offer, accept, sign, cet)
+        }
+      } yield {
+        dlcDb.copy(outcomeOpt = Some(outcome),
+                   oracleSigsOpt = Some(Vector(sig)))
+      }
+    } else {
+      Future.successful(dlcDb)
+    }
+  }
+
+  /** Process incoming utxos as normal, and then update the DLC states if applicable */
+  override protected def processIncomingUtxos(
+      tx: Transaction,
+      blockHashOpt: Option[DoubleSha256DigestBE],
+      newTags: Vector[AddressTag]): Future[Vector[SpendingInfoDb]] = {
+    super.processIncomingUtxos(tx, blockHashOpt, newTags).flatMap { res =>
+      for {
+        dlcDbs <- dlcDAO.findByFundingTxIds(Vector(tx.txIdBE))
+        _ <-
+          if (dlcDbs.nonEmpty) {
+            logger.info(
+              s"Processing tx ${tx.txIdBE.hex} for ${dlcDbs.size} DLC(s)")
+            insertTransaction(tx)
+          } else FutureUtil.unit
+
+        // Update the state to be confirmed or broadcasted
+        updated = dlcDbs.map { dlcDb =>
+          dlcDb.state match {
+            case DLCState.Offered | DLCState.Accepted | DLCState.Signed |
+                DLCState.Broadcasted =>
+              if (blockHashOpt.isDefined)
+                dlcDb.copy(state = DLCState.Confirmed)
+              else dlcDb.copy(state = DLCState.Broadcasted)
+            case DLCState.Confirmed | DLCState.Claimed |
+                DLCState.RemoteClaimed | DLCState.Refunded =>
+              dlcDb
+          }
+        }
+
+        _ <- dlcDAO.updateAll(updated)
+      } yield res
+    }
+  }
+
+  override protected def processOutgoingUtxos(
+      transaction: Transaction,
+      blockHashOpt: Option[DoubleSha256DigestBE]): Future[
+    Vector[SpendingInfoDb]] = {
+    super.processOutgoingUtxos(transaction, blockHashOpt).flatMap { res =>
+      val outPoints = transaction.inputs.map(_.previousOutput).toVector
+
+      for {
+        dlcDbs <- dlcDAO.findByFundingOutPoints(outPoints)
+        _ <-
+          if (dlcDbs.nonEmpty) {
+            logger.info(
+              s"Processing tx ${transaction.txIdBE.hex} for ${dlcDbs.size} DLC(s)")
+            insertTransaction(transaction)
+          } else FutureUtil.unit
+
+        withTx = dlcDbs.map(_.copy(closingTxIdOpt = Some(transaction.txIdBE)))
+        updatedFs = withTx.map(calculateAndSetState)
+        updated <- Future.sequence(updatedFs)
+
+        _ <- dlcDAO.updateAll(updated)
+      } yield res
+    }
+  }
+
+  /**
+    * Creates a DLCOffer, if one has already been created
+    * with the given parameters then that one will be returned instead.
+    *
+    * This is the first step of the initiator
+    */
+  override def createDLCOffer(
+      oracleInfo: OracleInfo,
+      contractInfo: ContractInfo,
+      collateral: Satoshis,
+      feeRateOpt: Option[FeeUnit],
+      locktime: UInt32,
+      refundLocktime: UInt32): Future[DLCOffer] = {
+    logger.debug("Calculating relevant wallet data for DLC Offer")
+
+    val timeouts =
+      DLCTimeouts(BlockStamp(locktime.toInt), BlockStamp(refundLocktime.toInt))
+
+    val paramHash = DLCMessage.calcParamHash(oracleInfo, contractInfo, timeouts)
+
+    logger.debug(
+      s"Checking if DLC Offer has already been made (${paramHash.hex})")
+
+    for {
+      feeRate <- determineFeeRate(feeRateOpt)
+      satoshisPerVirtualByte = SatoshisPerVirtualByte(feeRate.currencyUnit)
+      dlcOfferDbOpt <- dlcOfferDAO.findByParamHash(paramHash)
+      dlcOffer <- dlcOfferDbOpt match {
+        case Some(dlcOfferDb) =>
+          logger.debug(
+            s"DLC Offer (${paramHash.hex}) has already been made, returning offer")
+
+          for {
+            fundingInputs <-
+              dlcInputsDAO.findByParamHash(paramHash, isInitiator = true)
+            prevTxs <-
+              transactionDAO.findByTxIdBEs(fundingInputs.map(_.outPoint.txIdBE))
+          } yield {
+            val inputRefs = matchPrevTxsWithInputs(fundingInputs, prevTxs)
+            dlcOfferDb.toDLCOffer(inputRefs)
+          }
+        case None =>
+          createNewDLCOffer(
+            collateral = collateral,
+            oracleInfo = oracleInfo,
+            contractInfo = contractInfo,
+            feeRate = satoshisPerVirtualByte,
+            timeouts = timeouts
+          )
+      }
+    } yield dlcOffer
+  }
+
+  private def createNewDLCOffer(
+      collateral: CurrencyUnit,
+      oracleInfo: OracleInfo,
+      contractInfo: ContractInfo,
+      feeRate: SatoshisPerVirtualByte,
+      timeouts: DLCTimeouts): Future[DLCOffer] = {
+    logger.info("Creating DLC Offer")
+    val paramHash = DLCMessage.calcParamHash(oracleInfo, contractInfo, timeouts)
+
+    for {
+      account <- getDefaultAccountForType(AddressType.SegWit)
+      nextIndex <- getNextAvailableIndex(account, HDChainType.External)
+      _ <- writeDLCKeysToAddressDb(account, nextIndex)
+
+      (txBuilder, spendingInfos) <- fundRawTransactionInternal(
+        destinations = Vector(TransactionOutput(collateral, EmptyScriptPubKey)),
+        feeRate = feeRate,
+        fromAccount = account,
+        fromTagOpt = None,
+        markAsReserved = true
+      )
+      utxos = spendingInfos.map(DLCFundingInput.fromInputSigningInfo(_))
+
+      changeSPK =
+        txBuilder.finalizer.changeSPK
+          .asInstanceOf[WitnessScriptPubKey]
+      network = networkParameters.asInstanceOf[BitcoinNetwork]
+      changeAddr = Bech32Address(changeSPK, network)
+
+      dlcPubKeys = calcDLCPubKeys(account.xpub, nextIndex)
+
+      _ = logger.debug(
+        s"DLC Offer data collected, creating database entry, ${paramHash.hex}")
+
+      offer = DLCOffer(OracleAndContractInfo(oracleInfo, contractInfo),
+                       dlcPubKeys,
+                       collateral.satoshis,
+                       utxos,
+                       changeAddr,
+                       feeRate,
+                       timeouts)
+
+      dlcDb = DLCDb(
+        paramHash = paramHash,
+        tempContractId = offer.tempContractId,
+        contractIdOpt = None,
+        state = DLCState.Offered,
+        isInitiator = true,
+        account = account.hdAccount,
+        keyIndex = nextIndex,
+        oracleSigsOpt = None,
+        fundingOutPointOpt = None,
+        fundingTxIdOpt = None,
+        closingTxIdOpt = None,
+        outcomeOpt = None
+      )
+
+      dlc <- dlcDAO.create(dlcDb)
+
+      dlcOfferDb = DLCOfferDbHelper.fromDLCOffer(offer)
+
+      dlcInputs = spendingInfos.map(funding =>
+        DLCFundingInputDb(
+          paramHash = dlc.paramHash,
+          isInitiator = true,
+          outPoint = funding.outPoint,
+          output = funding.output,
+          redeemScriptOpt = InputInfo.getRedeemScript(funding.inputInfo),
+          witnessScriptOpt = InputInfo.getScriptWitness(funding.inputInfo)
+        ))
+
+      _ = logger.info(
+        s"Created offer with tempContractId ${offer.tempContractId.hex}")
+      _ <- dlcInputsDAO.createAll(dlcInputs)
+      _ <- dlcOfferDAO.create(dlcOfferDb)
+    } yield offer
+  }
+
+  private def initDLCForAccept(offer: DLCOffer): Future[(DLCDb, AccountDb)] = {
+    logger.info(
+      s"Initializing DLC from received offer with tempContractId ${offer.tempContractId.hex}")
+    dlcDAO.findByParamHash(offer.paramHash).flatMap {
+      case Some(dlcDb) =>
+        accountDAO
+          .findByAccount(dlcDb.account)
+          .map(account => (dlcDb, account.get))
+      case None =>
+        for {
+          account <- getDefaultAccountForType(AddressType.SegWit)
+          nextIndex <- getNextAvailableIndex(account, HDChainType.External)
+          dlc = {
+            DLCDb(
+              paramHash = offer.paramHash,
+              tempContractId = offer.tempContractId,
+              contractIdOpt = None,
+              state = DLCState.Accepted,
+              isInitiator = false,
+              account = account.hdAccount,
+              keyIndex = nextIndex,
+              oracleSigsOpt = None,
+              fundingOutPointOpt = None,
+              fundingTxIdOpt = None,
+              closingTxIdOpt = None,
+              outcomeOpt = None
+            )
+          }
+          _ <- writeDLCKeysToAddressDb(account, nextIndex)
+          writtenDLC <- dlcDAO.create(dlc)
+        } yield (writtenDLC, account)
+    }
+  }
+
+  /**
+    * Creates a DLCAccept from the default Segwit account from a given offer, if one has already been
+    * created with the given parameters then that one will be returned instead.
+    *
+    * This is the first step of the recipient
+    */
+  override def acceptDLCOffer(offer: DLCOffer): Future[DLCAccept] = {
+    logger.debug("Calculating relevant wallet data for DLC Accept")
+
+    val paramHash = offer.paramHash
+
+    val collateral = offer.contractInfo.max - offer.totalCollateral
+
+    logger.debug(s"Checking if Accept (${paramHash.hex}) has already been made")
+    for {
+      (dlc, account) <- initDLCForAccept(offer)
+      dlcAcceptDbOpt <- dlcAcceptDAO.findByParamHash(paramHash)
+      dlcAccept <- dlcAcceptDbOpt match {
+        case Some(dlcAcceptDb) =>
+          logger.debug(
+            s"DLC Accept (${paramHash.hex}) has already been made, returning accept")
+          for {
+            fundingInputs <-
+              dlcInputsDAO.findByParamHash(paramHash, isInitiator = false)
+            prevTxs <-
+              transactionDAO.findByTxIdBEs(fundingInputs.map(_.outPoint.txIdBE))
+            outcomeSigDbs <- dlcSigsDAO.findByParamHash(paramHash)
+            refundSigDb <- dlcRefundSigDAO.read(paramHash, false)
+          } yield {
+            val inputRefs = matchPrevTxsWithInputs(fundingInputs, prevTxs)
+            val outcomeSigs = outcomeSigDbs.map(_.toTuple)
+
+            dlcAcceptDb.toDLCAccept(inputRefs,
+                                    outcomeSigs.map {
+                                      case (outcome, sig) => outcome -> sig
+                                    },
+                                    refundSigDb.get.refundSig)
+          }
+        case None =>
+          createNewDLCAccept(dlc, account, collateral, offer)
+      }
+    } yield dlcAccept
+  }
+
+  private def createNewDLCAccept(
+      dlc: DLCDb,
+      account: AccountDb,
+      collateral: CurrencyUnit,
+      offer: DLCOffer): Future[DLCAccept] = {
+    logger.info(
+      s"Creating DLC Accept for tempContractId ${offer.tempContractId.hex}")
+    for {
+      (txBuilder, spendingInfos) <- fundRawTransactionInternal(
+        destinations = Vector(TransactionOutput(collateral, EmptyScriptPubKey)),
+        feeRate = offer.feeRate,
+        fromAccount = account,
+        fromTagOpt = None,
+        markAsReserved = true
+      )
+      network = networkParameters.asInstanceOf[BitcoinNetwork]
+
+      utxos = spendingInfos.map(DLCFundingInput.fromInputSigningInfo(_))
+
+      changeSPK = txBuilder.finalizer.changeSPK.asInstanceOf[P2WPKHWitnessSPKV0]
+      changeAddr = Bech32Address(changeSPK, network)
+
+      // todo change to a ExtSign.deriveAndSignFuture
+      extPrivKey =
+        keyManager.rootExtPrivKey.deriveChildPrivKey(account.hdAccount)
+
+      dlcPubKeys = calcDLCPubKeys(account.xpub, dlc.keyIndex)
+
+      fundingPrivKey =
+        extPrivKey
+          .deriveChildPrivKey(BIP32Path.fromString(s"m/0/${dlc.keyIndex}"))
+          .key
+
+      _ = require(dlcPubKeys.fundingKey == fundingPrivKey.publicKey,
+                  "Did not derive the same funding private and public key")
+
+      acceptWithoutSigs = DLCAcceptWithoutSigs(
+        totalCollateral = collateral.satoshis,
+        pubKeys = dlcPubKeys,
+        fundingInputs = utxos,
+        changeAddress = changeAddr,
+        tempContractId = offer.tempContractId
+      )
+
+      builder = DLCTxBuilder(offer, acceptWithoutSigs)
+
+      contractId <- builder.calcContractId
+
+      signer = DLCTxSigner(builder = builder,
+                           isInitiator = false,
+                           fundingKey = fundingPrivKey,
+                           finalAddress = dlcPubKeys.payoutAddress,
+                           fundingUtxos = spendingInfos)
+
+      fundingBuilder = builder.fundingTxBuilder
+      spkDb = ScriptPubKeyDb(fundingBuilder.fundingSPK)
+
+      _ <- scriptPubKeyDAO.create(spkDb)
+
+      _ = logger.info(s"Creating CET Sigs for ${contractId.toHex}")
+      cetSigs <- signer.createCETSigs()
+
+      _ = logger.debug(
+        s"DLC Accept data collected, creating database entry, ${dlc.paramHash.hex}")
+
+      dlcAcceptDb = DLCAcceptDb(
+        paramHash = dlc.paramHash,
+        tempContractId = offer.tempContractId,
+        fundingKey = dlcPubKeys.fundingKey,
+        finalAddress = dlcPubKeys.payoutAddress,
+        totalCollateral = collateral,
+        changeAddress = changeAddr
+      )
+
+      sigsDbs = cetSigs.outcomeSigs.map(sig =>
+        DLCCETSignatureDb(dlc.paramHash, isInitiator = false, sig._1, sig._2))
+
+      refundSigDb =
+        DLCRefundSigDb(dlc.paramHash, isInitiator = false, cetSigs.refundSig)
+
+      dlcOfferDb = DLCOfferDbHelper.fromDLCOffer(offer)
+
+      offerInputs = offer.fundingInputs.map(funding =>
+        DLCFundingInputDb(
+          paramHash = dlc.paramHash,
+          isInitiator = true,
+          outPoint = funding.outPoint,
+          output = funding.output,
+          redeemScriptOpt = funding.redeemScriptOpt,
+          witnessScriptOpt = None
+        ))
+
+      offerPrevTxs = offer.fundingInputs.map(funding =>
+        TransactionDbHelper.fromTransaction(funding.prevTx))
+
+      acceptInputs = spendingInfos.map(utxo =>
+        DLCFundingInputDb(
+          paramHash = dlc.paramHash,
+          isInitiator = false,
+          outPoint = utxo.outPoint,
+          output = utxo.output,
+          redeemScriptOpt = InputInfo.getRedeemScript(utxo.inputInfo),
+          witnessScriptOpt = InputInfo.getScriptWitness(utxo.inputInfo)
+        ))
+
+      accept =
+        dlcAcceptDb.toDLCAccept(utxos, cetSigs.outcomeSigs, cetSigs.refundSig)
+
+      _ = require(accept.tempContractId == offer.tempContractId,
+                  "Offer and Accept have differing tempContractIds!")
+
+      _ <- remoteTxDAO.upsertAll(offerPrevTxs)
+      _ <- dlcInputsDAO.createAll(offerInputs ++ acceptInputs)
+      _ <- dlcOfferDAO.create(dlcOfferDb)
+      _ <- dlcAcceptDAO.create(dlcAcceptDb)
+      _ <- dlcSigsDAO.createAll(sigsDbs)
+      _ <- dlcRefundSigDAO.create(refundSigDb)
+      dlcDb <- updateDLCContractIds(offer, accept)
+
+      _ = logger.info(
+        s"Created DLCAccept for tempContractId ${offer.tempContractId.hex} with contract Id ${contractId.toHex}")
+
+      fundingTx <- builder.buildFundingTx
+      outPoint = TransactionOutPoint(fundingTx.txId, UInt32.zero)
+      _ <- updateFundingOutPoint(dlcDb.contractIdOpt.get, outPoint)
+    } yield accept
+  }
+
+  def registerDLCAccept(accept: DLCAccept): Future[DLCDb] = {
+    logger.debug(
+      s"Checking if DLC Accept with tempContractId ${accept.tempContractId.hex} has already been registered")
+    val dbsF = for {
+      dlcDbOpt <- dlcDAO.findByTempContractId(accept.tempContractId)
+      (dlcDb, acceptDbOpt) <- dlcDbOpt match {
+        case Some(db) =>
+          dlcAcceptDAO
+            .findByParamHash(db.paramHash)
+            .map(acceptDbOpt => (db, acceptDbOpt))
+        case None =>
+          Future.failed(new RuntimeException(
+            s"No DLC Offer found with corresponding tempContractId ${accept.tempContractId.hex}, this wallet did not create the corresponding offer"))
+      }
+    } yield (dlcDb, acceptDbOpt)
+
+    dbsF.flatMap {
+      case (dlc, None) =>
+        require(
+          dlc.isInitiator,
+          s"We cannot register a DLCAccept if we are not the initiator, got $dlc")
+
+        logger.debug(
+          s"DLC Offer (${dlc.paramHash.hex}) found, adding accept data")
+
+        val paramHash = dlc.paramHash
+        val dlcAcceptDb = DLCAcceptDbHelper.fromDLCAccept(paramHash, accept)
+        val acceptInputs = accept.fundingInputs.map(funding =>
+          DLCFundingInputDb(
+            paramHash = paramHash,
+            isInitiator = false,
+            outPoint = funding.outPoint,
+            output = funding.output,
+            redeemScriptOpt = funding.redeemScriptOpt,
+            witnessScriptOpt = None
+          ))
+
+        val acceptPrevTxs = accept.fundingInputs.map { funding =>
+          TransactionDbHelper.fromTransaction(funding.prevTx)
+        }
+
+        val sigsDbs = accept.cetSigs.outcomeSigs
+          .map(sig =>
+            DLCCETSignatureDb(paramHash, isInitiator = false, sig._1, sig._2))
+
+        val refundSigDb = DLCRefundSigDb(paramHash,
+                                         isInitiator = false,
+                                         accept.cetSigs.refundSig)
+
+        logger.info(
+          s"Verifying ${accept.cetSigs.outcomeSigs.size} CET Signatures")
+        for {
+          isCETSigsValid <- verifyCETSigs(accept)
+          _ = if (!isCETSigsValid)
+            throw new IllegalArgumentException(
+              s"CET sigs provided are not valid! got ${accept.cetSigs.outcomeSigs}")
+          isRefundSigValid <- verifyRefundSig(accept)
+          _ = if (!isRefundSigValid)
+            throw new IllegalArgumentException(
+              s"Refund sig provided is not valid! got ${accept.cetSigs.refundSig}")
+
+          _ = logger.debug(
+            s"CET Signatures for tempContractId ${accept.tempContractId.hex} were valid, adding to database")
+
+          _ <- remoteTxDAO.createAll(acceptPrevTxs)
+          _ <- dlcInputsDAO.createAll(acceptInputs)
+          _ <- dlcSigsDAO.createAll(sigsDbs)
+          _ <- dlcRefundSigDAO.upsert(refundSigDb)
+          _ <- dlcAcceptDAO.upsert(dlcAcceptDb)
+          _ <- dlcDAO.update(dlc.updateState(DLCState.Accepted))
+
+          // .get is safe here because we must have an offer if we have a dlcDAO
+          offerDb <- dlcOfferDAO.findByParamHash(dlc.paramHash).map(_.get)
+          offerInputs <-
+            dlcInputsDAO.findByParamHash(dlc.paramHash, isInitiator = true)
+          prevTxs <-
+            transactionDAO.findByTxIdBEs(offerInputs.map(_.outPoint.txIdBE))
+          offer =
+            offerDb.toDLCOffer(matchPrevTxsWithInputs(offerInputs, prevTxs))
+
+          dlcDb <- updateDLCContractIds(offer, accept)
+
+          builder = DLCTxBuilder(offer, accept.withoutSigs)
+          fundingTx <- builder.buildFundingTx
+          outPoint = TransactionOutPoint(fundingTx.txId, UInt32.zero)
+          spkDb = ScriptPubKeyDb(builder.fundingTxBuilder.fundingSPK)
+          _ <- scriptPubKeyDAO.create(spkDb)
+          updatedDLCDb <-
+            updateFundingOutPoint(dlcDb.contractIdOpt.get, outPoint)
+        } yield updatedDLCDb
+      case (dlc, Some(_)) =>
+        logger.debug(
+          s"DLC Accept (${dlc.contractIdOpt.get.toHex}) has already been registered")
+        Future.successful(dlc)
+    }
+  }
+
+  override def signDLC(acceptTLV: DLCAcceptTLV): Future[DLCSign] = {
+    val tempId = acceptTLV.tempContractId
+
+    for {
+      dlcDbOpt <- dlcDAO.findByTempContractId(tempId)
+      dlcDb <- dlcDbOpt match {
+        case Some(db) => Future.successful(db)
+        case None =>
+          Future.failed(new RuntimeException(
+            s"No DLC found with corresponding tempContractId ${tempId.hex}, this wallet did not create the corresponding offer"))
+      }
+      offerDbOpt <- dlcOfferDAO.findByParamHash(dlcDb.paramHash)
+      // .get should be safe now
+      offerDb = offerDbOpt.get
+      accept =
+        DLCAccept.fromTLV(acceptTLV, walletConfig.network, offerDb.contractInfo)
+      dlcSign <- signDLC(accept)
+    } yield dlcSign
+  }
+
+  /**
+    * Creates signatures for the DLCs CETs and Funding Inputs
+    *
+    * This is the second step of the initiator
+    */
+  override def signDLC(accept: DLCAccept): Future[DLCSign] = {
+    for {
+      dlc <- registerDLCAccept(accept)
+      // .get should be safe now
+      contractId = dlc.contractIdOpt.get
+
+      signer <- signerFromDb(dlc.paramHash)
+
+      mySigs <- dlcSigsDAO.findByParamHash(dlc.paramHash, isInit = true)
+
+      cetSigs <-
+        if (mySigs.isEmpty) {
+          logger.info(s"Creating CET Sigs for contract ${contractId.toHex}")
+          for {
+            sigs <- signer.createCETSigs()
+            sigDbs = sigs.outcomeSigs.map(sig =>
+              DLCCETSignatureDb(dlc.paramHash,
+                                isInitiator = true,
+                                sig._1,
+                                sig._2))
+            _ <- dlcSigsDAO.createAll(sigDbs)
+          } yield sigs
+        } else {
+          logger.debug(s"CET Sigs already created for ${contractId.toHex}")
+          val outcomeSigs = mySigs.map(_.toTuple)
+          dlcRefundSigDAO
+            .findByParamHash(dlc.paramHash, isInit = true)
+            .flatMap {
+              case Some(refundDb) =>
+                Future.successful(
+                  CETSignatures(outcomeSigs, refundDb.refundSig))
+              case None =>
+                signer.createRefundSig().map { sig =>
+                  CETSignatures(outcomeSigs, sig)
+                }
+            }
+        }
+
+      _ = logger.info(s"Creating funding sigs for ${contractId.toHex}")
+      fundingSigs <- signer.createFundingTxSigs()
+
+      refundSigDb =
+        DLCRefundSigDb(dlc.paramHash, isInitiator = true, cetSigs.refundSig)
+      _ <- dlcRefundSigDAO.upsert(refundSigDb)
+
+      _ <- updateDLCState(dlc.contractIdOpt.get, DLCState.Signed)
+    } yield DLCSign(cetSigs, fundingSigs, contractId)
+  }
+
+  def verifyCETSigs(accept: DLCAccept): Future[Boolean] = {
+    verifierFromAccept(accept).flatMap(
+      _.verifyCETSigs(accept.cetSigs.outcomeSigs))
+  }
+
+  def verifyCETSigs(sign: DLCSign): Future[Boolean] = {
+    verifierFromDb(sign.contractId).flatMap(
+      _.verifyCETSigs(sign.cetSigs.outcomeSigs))
+  }
+
+  def verifyRefundSig(accept: DLCAccept): Future[Boolean] = {
+    verifierFromAccept(accept).map(_.verifyRefundSig(accept.cetSigs.refundSig))
+  }
+
+  def verifyRefundSig(sign: DLCSign): Future[Boolean] = {
+    verifierFromDb(sign.contractId).map(
+      _.verifyRefundSig(sign.cetSigs.refundSig))
+  }
+
+  def verifyFundingSigs(
+      inputs: Vector[DLCFundingInputDb],
+      sign: DLCSign): Future[Boolean] = {
+    if (inputs.count(!_.isInitiator) == sign.fundingSigs.length) {
+      verifierFromDb(sign.contractId).map { verifier =>
+        verifier.verifyRemoteFundingSigs(sign.fundingSigs)
+      }
+    } else {
+      logger.info(
+        "Funding Signatures provided did not have the correct amount of inputs")
+      Future.successful(false)
+    }
+  }
+
+  /** Takes a DLCSign an inserts the funding signatures into the database
+    * This is the only way one should insert sigs to the database
+    */
+  def addFundingSigs(sign: DLCSign): Future[Vector[DLCFundingInputDb]] = {
+    for {
+      dlc <- dlcDAO.findByContractId(sign.contractId).map(_.get)
+      inputs <- dlcInputsDAO.findByParamHash(dlc.paramHash)
+
+      _ = logger.info(
+        s"Verifying ${sign.fundingSigs.length} funding sigs for contract ${sign.contractId.toHex}")
+      isValid <- verifyFundingSigs(inputs = inputs, sign = sign)
+      _ <- {
+        if (!isValid)
+          Future.failed(new IllegalArgumentException(
+            s"Funding Signatures provided are not valid! got ${sign.fundingSigs}"))
+        else FutureUtil.unit
+      }
+
+      updatedInputs = sign.fundingSigs.map {
+        case (outPoint, witness) =>
+          inputs.find(_.outPoint == outPoint) match {
+            case Some(inputDb) =>
+              inputDb.copy(witnessScriptOpt = Some(witness))
+            case None =>
+              throw new NoSuchElementException(
+                s"Received signature for outPoint (${outPoint.hex}) that does not correspond to this contractId (${sign.contractId.toHex})")
+          }
+      }
+      written <- dlcInputsDAO.upsertAll(updatedInputs.toVector)
+    } yield written
+  }
+
+  override def addDLCSigs(signTLV: DLCSignTLV): Future[DLCDb] = {
+    val contractId = signTLV.contractId
+
+    for {
+      dlcDbOpt <- dlcDAO.findByContractId(contractId)
+      dlcDb <- dlcDbOpt match {
+        case Some(db) => Future.successful(db)
+        case None =>
+          Future.failed(new RuntimeException(
+            s"No DLC found with corresponding contractId ${contractId.toHex}"))
+      }
+      offerDbOpt <- dlcOfferDAO.findByParamHash(dlcDb.paramHash)
+      // .get should be safe now
+      offerDb = offerDbOpt.get
+      fundingInputDbs <- dlcInputsDAO.findByParamHash(dlcDb.paramHash)
+
+      txIds = fundingInputDbs.map(_.outPoint.txIdBE)
+      remotePrevTxs <- remoteTxDAO.findByTxIdBEs(txIds)
+      localPrevTxs <- transactionDAO.findByTxIdBEs(txIds)
+
+      prevTxs = (remotePrevTxs ++ localPrevTxs).map(_.transaction)
+      txs = prevTxs.groupBy(_.txIdBE)
+
+      fundingInputs = fundingInputDbs.map(input =>
+        input.toFundingInput(txs(input.outPoint.txIdBE).head))
+
+      offer = offerDb.toDLCOffer(fundingInputs)
+
+      sign = DLCSign.fromTLV(signTLV, offer)
+      result <- addDLCSigs(sign)
+    } yield result
+  }
+
+  /**
+    * Inputs the received signatures for a DLC into our database
+    *
+    * This is the second step of the recipient
+    */
+  override def addDLCSigs(sign: DLCSign): Future[DLCDb] = {
+    dlcDAO.findByContractId(sign.contractId).flatMap {
+      case Some(dlc) =>
+        val refundSigDb = DLCRefundSigDb(dlc.paramHash,
+                                         isInitiator = true,
+                                         sign.cetSigs.refundSig)
+        val sigsDbs = sign.cetSigs.outcomeSigs
+          .map(sig =>
+            DLCCETSignatureDb(dlc.paramHash,
+                              isInitiator = true,
+                              sig._1,
+                              sig._2))
+
+        logger.info(
+          s"Verifying CET Signatures for contract ${sign.contractId.toHex}")
+        for {
+          isRefundSigValid <- verifyRefundSig(sign)
+          _ = if (!isRefundSigValid)
+            throw new IllegalArgumentException(
+              s"Refund sig provided is not valid! got ${sign.cetSigs.refundSig}")
+
+          isCETSigsValid <- verifyCETSigs(sign)
+          _ = if (!isCETSigsValid)
+            throw new IllegalArgumentException(
+              s"CET sigs provided are not valid! got ${sign.cetSigs.outcomeSigs}")
+
+          _ = logger.info(
+            s"CET Signatures are valid for contract ${sign.contractId.toHex}")
+
+          _ <- addFundingSigs(sign)
+          _ <- dlcSigsDAO.createAll(sigsDbs)
+          _ <- dlcRefundSigDAO.create(refundSigDb)
+          updated <- dlcDAO.update(dlc.updateState(DLCState.Signed))
+        } yield updated
+      case None =>
+        Future.failed(new NoSuchElementException(
+          s"No DLC found with corresponding contractId ${sign.contractId.toHex}"))
+    }
+  }
+
+  private def getDLCFundingData(contractId: ByteVector): Future[
+    (DLCDb, DLCOfferDb, DLCAcceptDb, Vector[DLCFundingInputDb])] = {
+    for {
+      dlcDbOpt <- dlcDAO.findByContractId(contractId)
+      dlcDb = dlcDbOpt.get
+      (dlcDb, dlcOffer, dlcAccept, fundingInputs) <- getDLCFundingData(
+        dlcDb.paramHash)
+    } yield (dlcDb, dlcOffer, dlcAccept, fundingInputs)
+  }
+
+  private def getDLCFundingData(paramHash: Sha256DigestBE): Future[
+    (DLCDb, DLCOfferDb, DLCAcceptDb, Vector[DLCFundingInputDb])] = {
+    for {
+      dlcDbOpt <- dlcDAO.findByParamHash(paramHash)
+      dlcDb = dlcDbOpt.get
+      dlcOfferOpt <- dlcOfferDAO.findByParamHash(paramHash)
+      dlcOffer = dlcOfferOpt.get
+      dlcAcceptOpt <- dlcAcceptDAO.findByParamHash(paramHash)
+      dlcAccept = dlcAcceptOpt.get
+      fundingInputs <- dlcInputsDAO.findByParamHash(paramHash)
+    } yield (dlcDb, dlcOffer, dlcAccept, fundingInputs)
+  }
+
+  private def getAllDLCData(contractId: ByteVector): Future[
+    (
+        DLCDb,
+        DLCOfferDb,
+        DLCAcceptDb,
+        Vector[DLCRefundSigDb],
+        Vector[DLCFundingInputDb],
+        Vector[DLCCETSignatureDb])] = {
+    for {
+      dlcDbOpt <- dlcDAO.findByContractId(contractId)
+      dlcDb = dlcDbOpt.get
+      (_, dlcOffer, dlcAccept, refundSigs, fundingInputs, outcomeSigs) <-
+        getAllDLCData(dlcDb.paramHash)
+    } yield (dlcDb, dlcOffer, dlcAccept, refundSigs, fundingInputs, outcomeSigs)
+  }
+
+  private def getAllDLCData(paramHash: Sha256DigestBE): Future[
+    (
+        DLCDb,
+        DLCOfferDb,
+        DLCAcceptDb,
+        Vector[DLCRefundSigDb],
+        Vector[DLCFundingInputDb],
+        Vector[DLCCETSignatureDb])] = {
+    for {
+      (dlcDb, dlcOffer, dlcAccept, fundingInputs) <- getDLCFundingData(
+        paramHash)
+      refundSigs <- dlcRefundSigDAO.findByParamHash(paramHash)
+      outcomeSigs <- dlcSigsDAO.findByParamHash(paramHash)
+    } yield (dlcDb, dlcOffer, dlcAccept, refundSigs, fundingInputs, outcomeSigs)
+  }
+
+  private def fundingUtxosFromDb(
+      dlcDb: DLCDb,
+      fundingInputs: Vector[DLCFundingInputDb]): Future[
+    Vector[ScriptSignatureParams[InputInfo]]] = {
+    val outPoints =
+      fundingInputs.filter(_.isInitiator == dlcDb.isInitiator).map(_.outPoint)
+
+    for {
+      utxos <- listUtxos(outPoints)
+      scriptSigParams <-
+        FutureUtil.foldLeftAsync(Vector.empty[ScriptSignatureParams[InputInfo]],
+                                 utxos) { (accum, utxo) =>
+          transactionDAO
+            .findByOutPoint(utxo.outPoint)
+            .map(txOpt =>
+              utxo.toUTXOInfo(keyManager, txOpt.get.transaction) +: accum)
+        }
+    } yield scriptSigParams
+  }
+
+  private def verifierFromAccept(
+      accept: DLCAccept): Future[DLCSignatureVerifier] = {
+    for {
+      dlcDbOpt <- dlcDAO.findByTempContractId(accept.tempContractId)
+      dlcDb = dlcDbOpt.get
+      dlcOfferOpt <- dlcOfferDAO.findByParamHash(dlcDb.paramHash)
+      dlcOffer = dlcOfferOpt.get
+      fundingInputsDb <- dlcInputsDAO.findByParamHash(dlcDb.paramHash)
+      localFundingInputs = fundingInputsDb.filter(_.isInitiator)
+      prevTxs <-
+        transactionDAO.findByTxIdBEs(localFundingInputs.map(_.outPoint.txIdBE))
+    } yield {
+      val offerFundingInputs =
+        matchPrevTxsWithInputs(localFundingInputs, prevTxs)
+
+      val builder =
+        DLCTxBuilder(dlcOffer.toDLCOffer(offerFundingInputs),
+                     accept.withoutSigs)
+
+      DLCSignatureVerifier(builder, dlcDb.isInitiator)
+    }
+  }
+
+  private def verifierFromDb(
+      contractId: ByteVector): Future[DLCSignatureVerifier] = {
+    getDLCFundingData(contractId).flatMap {
+      case (dlcDb, dlcOffer, dlcAccept, fundingInputsDb) =>
+        verifierFromDbData(dlcDb, dlcOffer, dlcAccept, fundingInputsDb)
+    }
+  }
+
+  private def builderFromDbData(
+      dlcDb: DLCDb,
+      dlcOffer: DLCOfferDb,
+      dlcAccept: DLCAcceptDb,
+      fundingInputsDb: Vector[DLCFundingInputDb]): Future[DLCTxBuilder] = {
+    val (offerDbFundingInputs, acceptDbFundingInputs) =
+      fundingInputsDb.partition(_.isInitiator)
+    val (localDbFundingInputs, remoteDbFundingInputs) = if (dlcDb.isInitiator) {
+      (offerDbFundingInputs, acceptDbFundingInputs)
+    } else {
+      (acceptDbFundingInputs, offerDbFundingInputs)
+    }
+
+    for {
+      localPrevTxs <- transactionDAO.findByTxIdBEs(
+        localDbFundingInputs.map(_.outPoint.txIdBE))
+      remotePrevTxs <-
+        remoteTxDAO.findByTxIdBEs(remoteDbFundingInputs.map(_.outPoint.txIdBE))
+    } yield {
+      val localFundingInputs = matchPrevTxsWithInputs(inputs =
+                                                        localDbFundingInputs,
+                                                      prevTxs = localPrevTxs)
+
+      val remoteFundingInputs = matchPrevTxsWithInputs(inputs =
+                                                         remoteDbFundingInputs,
+                                                       prevTxs = remotePrevTxs)
+
+      val (offerFundingInputs, acceptFundingInputs) = if (dlcDb.isInitiator) {
+        (localFundingInputs, remoteFundingInputs)
+      } else {
+        (remoteFundingInputs, localFundingInputs)
+      }
+
+      val offer = dlcOffer.toDLCOffer(offerFundingInputs)
+      val accept = dlcAccept.toDLCAcceptWithoutSigs(offer.tempContractId,
+                                                    acceptFundingInputs)
+
+      DLCTxBuilder(offer, accept)
+    }
+  }
+
+  /** Takes in a list of inputs to fund DLCs, and pairs them with the full funding transaction for this input
+    * and then converts the input tx pair to a [[DLCFundingInput]]
+    * @throws NoSuchElementException when we have an input we cannot find the funding transaction for
+    */
+  private def matchPrevTxsWithInputs(
+      inputs: Vector[DLCFundingInputDb],
+      prevTxs: Vector[TransactionDb]): Vector[DLCFundingInput] = {
+    inputs.map { i =>
+      prevTxs.find(_.txId == i.outPoint.txId) match {
+        case Some(txDb) => i.toFundingInput(txDb.transaction)
+        case None =>
+          throw new NoSuchElementException(
+            s"Could not find previous transaction with txIdBE=${i.outPoint.txId.flip.hex}")
+      }
+    }
+  }
+
+  private def verifierFromDbData(
+      dlcDb: DLCDb,
+      dlcOffer: DLCOfferDb,
+      dlcAccept: DLCAcceptDb,
+      fundingInputsDb: Vector[DLCFundingInputDb]): Future[
+    DLCSignatureVerifier] = {
+    val builderF =
+      builderFromDbData(dlcDb, dlcOffer, dlcAccept, fundingInputsDb)
+
+    builderF.map(DLCSignatureVerifier(_, dlcDb.isInitiator))
+  }
+
+  private def signerFromDb(paramHash: Sha256DigestBE): Future[DLCTxSigner] = {
+    for {
+      (dlcDb, dlcOffer, dlcAccept, fundingInputsDb) <- getDLCFundingData(
+        paramHash)
+      signer <- signerFromDb(dlcDb, dlcOffer, dlcAccept, fundingInputsDb)
+    } yield signer
+  }
+
+  private def signerFromDb(
+      dlcDb: DLCDb,
+      dlcOffer: DLCOfferDb,
+      dlcAccept: DLCAcceptDb,
+      fundingInputsDb: Vector[DLCFundingInputDb]): Future[DLCTxSigner] = {
+    for {
+      fundingUtxos <- fundingUtxosFromDb(dlcDb, fundingInputsDb)
+      builder <- builderFromDbData(dlcDb = dlcDb,
+                                   dlcOffer = dlcOffer,
+                                   dlcAccept = dlcAccept,
+                                   fundingInputsDb = fundingInputsDb)
+    } yield {
+      val extPrivKey =
+        keyManager.rootExtPrivKey.deriveChildPrivKey(dlcDb.account)
+
+      val (fundingKey, payoutAddress) = if (dlcDb.isInitiator) {
+        (dlcOffer.fundingKey, dlcOffer.payoutAddress)
+      } else {
+        (dlcAccept.fundingKey, dlcAccept.finalAddress)
+      }
+
+      val fundingPrivKey =
+        extPrivKey
+          .deriveChildPrivKey(BIP32Path.fromString(s"m/0/${dlcDb.keyIndex}"))
+          .key
+
+      require(fundingKey == fundingPrivKey.publicKey)
+
+      DLCTxSigner(builder = builder,
+                  isInitiator = dlcDb.isInitiator,
+                  fundingKey = fundingPrivKey,
+                  finalAddress = payoutAddress,
+                  fundingUtxos = fundingUtxos)
+    }
+  }
+
+  private def executorFromDb(
+      dlcDb: DLCDb,
+      dlcOffer: DLCOfferDb,
+      dlcAccept: DLCAcceptDb,
+      fundingInputsDb: Vector[DLCFundingInputDb]): Future[DLCExecutor] = {
+    signerFromDb(dlcDb, dlcOffer, dlcAccept, fundingInputsDb).map(
+      DLCExecutor.apply)
+  }
+
+  private def executorAndSetupFromDb(
+      contractId: ByteVector): Future[(DLCExecutor, SetupDLC)] = {
+    getAllDLCData(contractId).flatMap {
+      case (dlcDb,
+            dlcOffer,
+            dlcAccept,
+            refundSigs,
+            fundingInputsDb,
+            outcomeSigDbs) =>
+        executorAndSetupFromDb(dlcDb,
+                               dlcOffer,
+                               dlcAccept,
+                               refundSigs,
+                               fundingInputsDb,
+                               outcomeSigDbs)
+    }
+  }
+
+  private def executorAndSetupFromDb(
+      dlcDb: DLCDb,
+      dlcOffer: DLCOfferDb,
+      dlcAccept: DLCAcceptDb,
+      refundSigs: Vector[DLCRefundSigDb],
+      fundingInputs: Vector[DLCFundingInputDb],
+      outcomeSigDbs: Vector[DLCCETSignatureDb]): Future[
+    (DLCExecutor, SetupDLC)] = {
+
+    executorFromDb(dlcDb, dlcOffer, dlcAccept, fundingInputs)
+      .flatMap { executor =>
+        // Filter for only counter party's outcome sigs
+        val outcomeSigs = outcomeSigDbs
+          .filter(_.isInitiator == !dlcDb.isInitiator)
+          .map(_.toTuple)
+
+        val refundSig =
+          refundSigs.find(_.isInitiator == !dlcDb.isInitiator).get.refundSig
+        val setupF = if (dlcDb.isInitiator) {
+          // Note that the funding tx in this setup is not signed
+          val cetSigs = CETSignatures(outcomeSigs, refundSig)
+          executor.setupDLCOffer(cetSigs)
+        } else {
+          val cetSigs = CETSignatures(outcomeSigs, refundSig)
+          val fundingSigs =
+            fundingInputs
+              .filter(_.isInitiator)
+              .map { input =>
+                input.witnessScriptOpt match {
+                  case Some(witnessScript) =>
+                    witnessScript match {
+                      case EmptyScriptWitness =>
+                        throw new RuntimeException(
+                          "Script witness cannot be empty")
+                      case witness: ScriptWitnessV0 => (input.outPoint, witness)
+                    }
+                  case None => throw new RuntimeException("")
+                }
+              }
+          executor.setupDLCAccept(cetSigs, FundingSignatures(fundingSigs))
+        }
+
+        setupF.map((executor, _))
+      }
+  }
+
+  override def getDLCFundingTx(contractId: ByteVector): Future[Transaction] = {
+    for {
+      (dlcDb, dlcOffer, dlcAccept, fundingInputs) <- getDLCFundingData(
+        contractId)
+
+      signer <- signerFromDb(dlcDb, dlcOffer, dlcAccept, fundingInputs)
+      fundingTx <- {
+        if (dlcDb.isInitiator) {
+          // TODO: If this is called after seeing the funding tx on-chain, it should return that one
+          signer.builder.buildFundingTx
+        } else {
+          val remoteSigs = fundingInputs
+            .filter(_.isInitiator)
+            .map { input =>
+              input.witnessScriptOpt match {
+                case Some(witnessScript) =>
+                  witnessScript match {
+                    case EmptyScriptWitness =>
+                      throw new RuntimeException(
+                        "Script witness cannot be empty")
+                    case witness: ScriptWitnessV0 => (input.outPoint, witness)
+                  }
+                case None => throw new RuntimeException("")
+              }
+            }
+          signer.signFundingTx(FundingSignatures(remoteSigs))
+        }
+      }
+      _ = logger.info(
+        s"Created funding transaction ${fundingTx.txIdBE.hex} for contract ${contractId.toHex}")
+    } yield fundingTx
+  }
+
+  override def broadcastDLCFundingTx(
+      contractId: ByteVector): Future[Transaction] = {
+    for {
+      tx <- getDLCFundingTx(contractId)
+      _ = logger.info(
+        s"Broadcasting funding transaction ${tx.txIdBE.hex} for contract ${contractId.toHex}")
+      _ <- broadcastTransaction(tx)
+
+      _ <- updateDLCState(contractId, DLCState.Broadcasted)
+    } yield tx
+  }
+
+  override def executeDLC(
+      contractId: ByteVector,
+      oracleSigs: Vector[SchnorrDigitalSignature]): Future[Transaction] = {
+    require(oracleSigs.nonEmpty, "Must provide at least one oracle signature")
+    for {
+      (executor, setup) <- executorAndSetupFromDb(contractId)
+
+      payout = executor.getPayout(oracleSigs)
+      _ = if (payout <= 0.satoshis)
+        throw new UnsupportedOperationException(
+          "Cannot execute a losing outcome")
+
+      executed <- executor.executeDLC(setup, oracleSigs)
+      (tx, outcome) = (executed.cet, executed.outcome)
+      _ = logger.info(
+        s"Created DLC execution transaction ${tx.txIdBE.hex} for contract ${contractId.toHex}")
+
+      _ <- updateDLCOracleSigs(contractId, oracleSigs)
+      _ <- updateDLCState(contractId, DLCState.Claimed)
+      _ <- updateDLCOutcome(contractId, outcome)
+      _ <- updateClosingTxId(contractId, tx.txIdBE)
+
+      _ <- processTransaction(tx, None)
+    } yield tx
+  }
+
+  override def executeDLCRefund(contractId: ByteVector): Future[Transaction] = {
+    for {
+      (executor, setup) <- executorAndSetupFromDb(contractId)
+      refundTx = executor.executeRefundDLC(setup).refundTx
+      _ = logger.info(
+        s"Created DLC refund transaction ${refundTx.txIdBE.hex} for contract ${contractId.toHex}")
+
+      _ <- updateDLCState(contractId, DLCState.Refunded)
+      _ <- updateClosingTxId(contractId, refundTx.txIdBE)
+
+      _ <- processTransaction(refundTx, blockHashOpt = None)
+    } yield refundTx
+  }
+
+  override def listDLCs(): Future[Vector[DLCStatus]] = {
+    for {
+      ids <- dlcDAO.findAll().map(_.map(_.paramHash))
+      dlcFs = ids.map(findDLC)
+      dlcs <- Future.sequence(dlcFs)
+    } yield {
+      dlcs.collect {
+        case Some(dlc) => dlc
+      }
+    }
+  }
+
+  override def findDLC(paramHash: Sha256DigestBE): Future[Option[DLCStatus]] = {
+    for {
+      dlcDbOpt <- dlcDAO.read(paramHash)
+      offerDbOpt <- dlcOfferDAO.read(paramHash)
+    } yield (dlcDbOpt, offerDbOpt) match {
+      case (Some(dlcDb), Some(offerDb)) =>
+        val totalCollateral = offerDb.contractInfo.max
+
+        val localCollateral = if (dlcDb.isInitiator) {
+          offerDb.totalCollateral
+        } else {
+          totalCollateral - offerDb.totalCollateral
+        }
+
+        val status = dlcDb.state match {
+          case DLCState.Offered =>
+            Offered(
+              paramHash,
+              dlcDb.isInitiator,
+              dlcDb.tempContractId,
+              offerDb.oracleInfo,
+              offerDb.contractInfo,
+              offerDb.dlcTimeouts,
+              offerDb.feeRate,
+              totalCollateral,
+              localCollateral
+            )
+          case DLCState.Accepted =>
+            Accepted(
+              paramHash,
+              dlcDb.isInitiator,
+              dlcDb.tempContractId,
+              dlcDb.contractIdOpt.get,
+              offerDb.oracleInfo,
+              offerDb.contractInfo,
+              offerDb.dlcTimeouts,
+              offerDb.feeRate,
+              totalCollateral,
+              localCollateral
+            )
+          case DLCState.Signed =>
+            Signed(
+              paramHash,
+              dlcDb.isInitiator,
+              dlcDb.tempContractId,
+              dlcDb.contractIdOpt.get,
+              offerDb.oracleInfo,
+              offerDb.contractInfo,
+              offerDb.dlcTimeouts,
+              offerDb.feeRate,
+              totalCollateral,
+              localCollateral
+            )
+          case DLCState.Broadcasted =>
+            Broadcasted(
+              paramHash,
+              dlcDb.isInitiator,
+              dlcDb.tempContractId,
+              dlcDb.contractIdOpt.get,
+              offerDb.oracleInfo,
+              offerDb.contractInfo,
+              offerDb.dlcTimeouts,
+              offerDb.feeRate,
+              totalCollateral,
+              localCollateral,
+              dlcDb.fundingTxIdOpt.get
+            )
+          case DLCState.Confirmed =>
+            Confirmed(
+              paramHash,
+              dlcDb.isInitiator,
+              dlcDb.tempContractId,
+              dlcDb.contractIdOpt.get,
+              offerDb.oracleInfo,
+              offerDb.contractInfo,
+              offerDb.dlcTimeouts,
+              offerDb.feeRate,
+              totalCollateral,
+              localCollateral,
+              dlcDb.fundingTxIdOpt.get
+            )
+          case DLCState.Claimed =>
+            Claimed(
+              paramHash,
+              dlcDb.isInitiator,
+              dlcDb.tempContractId,
+              dlcDb.contractIdOpt.get,
+              offerDb.oracleInfo,
+              offerDb.contractInfo,
+              offerDb.dlcTimeouts,
+              offerDb.feeRate,
+              totalCollateral,
+              localCollateral,
+              dlcDb.fundingTxIdOpt.get,
+              dlcDb.closingTxIdOpt.get,
+              dlcDb.oracleSigsOpt.get,
+              dlcDb.outcomeOpt.get
+            )
+          case DLCState.RemoteClaimed =>
+            val oracleSigs = dlcDb.oracleSigsOpt.get
+            require(oracleSigs.size == 1,
+                    "Remote claimed should only have one oracle sig")
+
+            RemoteClaimed(
+              paramHash,
+              dlcDb.isInitiator,
+              dlcDb.tempContractId,
+              dlcDb.contractIdOpt.get,
+              offerDb.oracleInfo,
+              offerDb.contractInfo,
+              offerDb.dlcTimeouts,
+              offerDb.feeRate,
+              totalCollateral,
+              localCollateral,
+              dlcDb.fundingTxIdOpt.get,
+              dlcDb.closingTxIdOpt.get,
+              oracleSigs.head,
+              dlcDb.outcomeOpt.get
+            )
+          case DLCState.Refunded =>
+            Refunded(
+              paramHash,
+              dlcDb.isInitiator,
+              dlcDb.tempContractId,
+              dlcDb.contractIdOpt.get,
+              offerDb.oracleInfo,
+              offerDb.contractInfo,
+              offerDb.dlcTimeouts,
+              offerDb.feeRate,
+              totalCollateral,
+              localCollateral,
+              dlcDb.fundingTxIdOpt.get,
+              dlcDb.closingTxIdOpt.get
+            )
+        }
+
+        Some(status)
+      case (None, None) | (None, Some(_)) | (Some(_), None) =>
+        None
+    }
+  }
+}
+
+object DLCWallet extends WalletLogger {
+
+  private case class DLCWalletImpl(
+      keyManager: BIP39KeyManager,
+      nodeApi: NodeApi,
+      chainQueryApi: ChainQueryApi,
+      feeRateApi: FeeRateApi,
+      override val creationTime: Instant
+  )(implicit
+      val walletConfig: WalletAppConfig,
+      val dlcConfig: DLCAppConfig,
+      val ec: ExecutionContext
+  ) extends DLCWallet
+
+  def apply(
+      keyManager: BIP39KeyManager,
+      nodeApi: NodeApi,
+      chainQueryApi: ChainQueryApi,
+      feeRateApi: FeeRateApi,
+      creationTime: Instant)(implicit
+      config: WalletAppConfig,
+      dlcConfig: DLCAppConfig,
+      ec: ExecutionContext): DLCWallet = {
+    DLCWalletImpl(keyManager, nodeApi, chainQueryApi, feeRateApi, creationTime)
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCWalletApi.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCWalletApi.scala
new file mode 100644
index 0000000000..c39420485e
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/DLCWalletApi.scala
@@ -0,0 +1,96 @@
+package org.bitcoins.dlc.wallet
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc.DLCStatus
+import org.bitcoins.core.api.wallet._
+import org.bitcoins.core.currency.Satoshis
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.tlv._
+import org.bitcoins.core.protocol.transaction.Transaction
+import org.bitcoins.core.wallet.fee.FeeUnit
+import org.bitcoins.crypto.{SchnorrDigitalSignature, Sha256DigestBE}
+import org.bitcoins.dlc.wallet.models.DLCDb
+import scodec.bits.ByteVector
+
+import scala.concurrent.Future
+
+trait DLCWalletApi { self: WalletApi =>
+
+  def createDLCOffer(
+      oracleInfo: OracleInfo,
+      contractInfoTLV: ContractInfoTLV,
+      collateral: Satoshis,
+      feeRateOpt: Option[FeeUnit],
+      locktime: UInt32,
+      refundLT: UInt32): Future[DLCOffer] = {
+    val contractInfo = ContractInfo.fromTLV(contractInfoTLV)
+    createDLCOffer(oracleInfo,
+                   contractInfo,
+                   collateral,
+                   feeRateOpt,
+                   locktime,
+                   refundLT)
+  }
+
+  def createDLCOffer(
+      oracleInfo: OracleInfo,
+      contractInfo: ContractInfo,
+      collateral: Satoshis,
+      feeRateOpt: Option[FeeUnit],
+      locktime: UInt32,
+      refundLT: UInt32): Future[DLCOffer]
+
+  def registerDLCOffer(dlcOffer: DLCOffer): Future[DLCOffer] = {
+    createDLCOffer(
+      dlcOffer.oracleInfo,
+      dlcOffer.contractInfo,
+      dlcOffer.totalCollateral,
+      Some(dlcOffer.feeRate),
+      dlcOffer.timeouts.contractMaturity.toUInt32,
+      dlcOffer.timeouts.contractTimeout.toUInt32
+    )
+  }
+
+  def acceptDLCOffer(dlcOfferTLV: DLCOfferTLV): Future[DLCAccept] = {
+    acceptDLCOffer(DLCOffer.fromTLV(dlcOfferTLV))
+  }
+
+  def acceptDLCOffer(dlcOffer: DLCOffer): Future[DLCAccept]
+
+  def signDLC(acceptTLV: DLCAcceptTLV): Future[DLCSign]
+
+  def signDLC(accept: DLCAccept): Future[DLCSign]
+
+  def addDLCSigs(signTLV: DLCSignTLV): Future[DLCDb]
+
+  def addDLCSigs(sigs: DLCSign): Future[DLCDb]
+
+  def getDLCFundingTx(contractId: ByteVector): Future[Transaction]
+
+  def broadcastDLCFundingTx(contractId: ByteVector): Future[Transaction]
+
+  /** Creates the CET for the given contractId and oracle signature, does not broadcast it */
+  def executeDLC(
+      contractId: ByteVector,
+      oracleSig: SchnorrDigitalSignature): Future[Transaction] =
+    executeDLC(contractId, Vector(oracleSig))
+
+  /** Creates the CET for the given contractId and oracle signature, does not broadcast it */
+  def executeDLC(
+      contractId: ByteVector,
+      oracleSigs: Vector[SchnorrDigitalSignature]): Future[Transaction]
+
+  /** Creates the refund transaction for the given contractId, does not broadcast it */
+  def executeDLCRefund(contractId: ByteVector): Future[Transaction]
+
+  def listDLCs(): Future[Vector[DLCStatus]]
+
+  def findDLC(paramHash: Sha256DigestBE): Future[Option[DLCStatus]]
+}
+
+/** An HDWallet that supports DLCs and both Neutrino and SPV methods of syncing */
+trait AnyDLCHDWalletApi
+    extends HDWalletApi
+    with DLCWalletApi
+    with NeutrinoWalletApi
+    with SpvWalletApi
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCAcceptDAO.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCAcceptDAO.scala
new file mode 100644
index 0000000000..20d832426e
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCAcceptDAO.scala
@@ -0,0 +1,99 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.protocol.BitcoinAddress
+import org.bitcoins.crypto.{ECPublicKey, Sha256Digest, Sha256DigestBE}
+import org.bitcoins.db.{CRUD, SlickUtil}
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import slick.lifted.{ForeignKeyQuery, PrimaryKey, ProvenShape}
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCAcceptDAO()(implicit
+    val ec: ExecutionContext,
+    override val appConfig: DLCAppConfig)
+    extends CRUD[DLCAcceptDb, Sha256DigestBE]
+    with SlickUtil[DLCAcceptDb, Sha256DigestBE] {
+  private val mappers = new org.bitcoins.db.DbCommonsColumnMappers(profile)
+  import mappers._
+  import profile.api._
+
+  override val table: TableQuery[DLCAcceptTable] = TableQuery[DLCAcceptTable]
+
+  private lazy val dlcTable: slick.lifted.TableQuery[DLCDAO#DLCTable] = {
+    DLCDAO().table
+  }
+
+  override def createAll(ts: Vector[DLCAcceptDb]): Future[Vector[DLCAcceptDb]] =
+    createAllNoAutoInc(ts, safeDatabase)
+
+  override protected def findByPrimaryKeys(
+      ids: Vector[Sha256DigestBE]): Query[DLCAcceptTable, DLCAcceptDb, Seq] =
+    table.filter(_.paramHash.inSet(ids))
+
+  override def findByPrimaryKey(
+      id: Sha256DigestBE): Query[DLCAcceptTable, DLCAcceptDb, Seq] = {
+    table
+      .filter(_.paramHash === id)
+  }
+
+  override def findAll(
+      dlcs: Vector[DLCAcceptDb]): Query[DLCAcceptTable, DLCAcceptDb, Seq] =
+    findByPrimaryKeys(dlcs.map(_.paramHash))
+
+  def findByParamHash(
+      paramHash: Sha256DigestBE): Future[Option[DLCAcceptDb]] = {
+    val q = table.filter(_.paramHash === paramHash)
+
+    safeDatabase.run(q.result).map {
+      case h +: Vector() =>
+        Some(h)
+      case Vector() =>
+        None
+      case dlcs: Vector[DLCAcceptDb] =>
+        throw new RuntimeException(
+          s"More than one DLCAccept per paramHash ($paramHash), got: $dlcs")
+    }
+  }
+
+  def findByParamHash(paramHash: Sha256Digest): Future[Option[DLCAcceptDb]] =
+    findByParamHash(paramHash.flip)
+
+  class DLCAcceptTable(tag: Tag)
+      extends Table[DLCAcceptDb](tag, "wallet_dlc_accepts") {
+
+    def paramHash: Rep[Sha256DigestBE] = column("Param_hash", O.PrimaryKey)
+
+    def tempContractId: Rep[Sha256Digest] =
+      column("temp_contract_id", O.Unique)
+
+    def fundingKey: Rep[ECPublicKey] = column("funding_key")
+
+    def payoutAddress: Rep[BitcoinAddress] = column("payout_address")
+
+    def totalCollateral: Rep[CurrencyUnit] = column("total_collateral")
+
+    def changeAddress: Rep[BitcoinAddress] = column("change_address")
+
+    def * : ProvenShape[DLCAcceptDb] =
+      (paramHash,
+       tempContractId,
+       fundingKey,
+       payoutAddress,
+       totalCollateral,
+       changeAddress).<>(DLCAcceptDb.tupled, DLCAcceptDb.unapply)
+
+    def primaryKey: PrimaryKey =
+      primaryKey(name = "pk_dlc_accept", sourceColumns = paramHash)
+
+    def fk: ForeignKeyQuery[_, DLCDb] =
+      foreignKey("fk_param_hash",
+                 sourceColumns = paramHash,
+                 targetTableQuery = dlcTable)(_.paramHash)
+
+    def fkTempContractId: ForeignKeyQuery[_, DLCDb] =
+      foreignKey("fk_temp_contract_id",
+                 sourceColumns = tempContractId,
+                 targetTableQuery = dlcTable)(_.tempContractId)
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCAcceptDb.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCAcceptDb.scala
new file mode 100644
index 0000000000..386564e278
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCAcceptDb.scala
@@ -0,0 +1,74 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.{
+  DLCAccept,
+  DLCAcceptWithoutSigs
+}
+import org.bitcoins.commons.jsonmodels.dlc.{
+  CETSignatures,
+  DLCFundingInput,
+  DLCPublicKeys
+}
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.protocol.BitcoinAddress
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.crypto.{
+  ECAdaptorSignature,
+  ECPublicKey,
+  Sha256Digest,
+  Sha256DigestBE
+}
+
+case class DLCAcceptDb(
+    paramHash: Sha256DigestBE,
+    tempContractId: Sha256Digest,
+    fundingKey: ECPublicKey,
+    finalAddress: BitcoinAddress,
+    totalCollateral: CurrencyUnit,
+    changeAddress: BitcoinAddress) {
+
+  def toDLCAccept(
+      fundingInputs: Vector[DLCFundingInput],
+      outcomeSigs: Vector[(DLCOutcomeType, ECAdaptorSignature)],
+      refundSig: PartialSignature): DLCAccept = {
+    val pubKeys =
+      DLCPublicKeys(fundingKey, finalAddress)
+    val cetSigs = CETSignatures(outcomeSigs, refundSig)
+    DLCAccept(totalCollateral.satoshis,
+              pubKeys,
+              fundingInputs,
+              changeAddress,
+              cetSigs,
+              tempContractId)
+  }
+
+  def toDLCAcceptWithoutSigs(
+      tempContractId: Sha256Digest,
+      fundingInputs: Vector[DLCFundingInput]): DLCAcceptWithoutSigs = {
+    val pubKeys =
+      DLCPublicKeys(fundingKey, finalAddress)
+
+    DLCAcceptWithoutSigs(totalCollateral.satoshis,
+                         pubKeys,
+                         fundingInputs,
+                         changeAddress,
+                         tempContractId)
+  }
+}
+
+object DLCAcceptDbHelper {
+
+  def fromDLCAccept(
+      paramHash: Sha256DigestBE,
+      accept: DLCAccept): DLCAcceptDb = {
+    DLCAcceptDb(
+      paramHash,
+      accept.tempContractId,
+      accept.pubKeys.fundingKey,
+      accept.pubKeys.payoutAddress,
+      accept.totalCollateral,
+      accept.changeAddress
+    )
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCCETSignatureDAO.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCCETSignatureDAO.scala
new file mode 100644
index 0000000000..bce1293f18
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCCETSignatureDAO.scala
@@ -0,0 +1,101 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.crypto.{ECAdaptorSignature, Sha256Digest, Sha256DigestBE}
+import org.bitcoins.db.{CRUD, SlickUtil}
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import slick.lifted.{ForeignKeyQuery, PrimaryKey, ProvenShape}
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCCETSignatureDAO()(implicit
+    val ec: ExecutionContext,
+    override val appConfig: DLCAppConfig)
+    extends CRUD[DLCCETSignatureDb, (Sha256DigestBE, DLCOutcomeType)]
+    with SlickUtil[DLCCETSignatureDb, (Sha256DigestBE, DLCOutcomeType)] {
+  private val mappers = new org.bitcoins.db.DbCommonsColumnMappers(profile)
+  import mappers._
+  import profile.api._
+
+  override val table: TableQuery[DLCCETSignatureTable] =
+    TableQuery[DLCCETSignatureTable]
+
+  private lazy val dlcTable: slick.lifted.TableQuery[DLCDAO#DLCTable] = {
+    DLCDAO().table
+  }
+
+  override def createAll(
+      ts: Vector[DLCCETSignatureDb]): Future[Vector[DLCCETSignatureDb]] =
+    createAllNoAutoInc(ts, safeDatabase)
+
+  override protected def findByPrimaryKeys(ids: Vector[(
+      Sha256DigestBE,
+      DLCOutcomeType)]): Query[DLCCETSignatureTable, DLCCETSignatureDb, Seq] =
+    table
+      .filter(_.paramHash.inSet(ids.map(_._1)))
+      .filter(_.outcome.inSet(ids.map(_._2)))
+
+  override def findByPrimaryKey(id: (Sha256DigestBE, DLCOutcomeType)): Query[
+    DLCCETSignatureTable,
+    DLCCETSignatureDb,
+    Seq] = {
+    table
+      .filter(_.paramHash === id._1)
+      .filter(_.outcome === id._2)
+  }
+
+  override def findAll(dlcs: Vector[DLCCETSignatureDb]): Query[
+    DLCCETSignatureTable,
+    DLCCETSignatureDb,
+    Seq] =
+    findByPrimaryKeys(dlcs.map(sig => (sig.paramHash, sig.outcome)))
+
+  def findByParamHash(
+      paramHash: Sha256DigestBE): Future[Vector[DLCCETSignatureDb]] = {
+    val q = table.filter(_.paramHash === paramHash)
+    safeDatabase.runVec(q.result)
+  }
+
+  def findByParamHash(
+      paramHash: Sha256DigestBE,
+      isInit: Boolean): Future[Vector[DLCCETSignatureDb]] = {
+    val q = table
+      .filter(_.paramHash === paramHash)
+      .filter(_.isInitiator === isInit)
+    safeDatabase.runVec(q.result)
+  }
+
+  def findByParamHash(
+      paramHash: Sha256Digest): Future[Vector[DLCCETSignatureDb]] =
+    findByParamHash(paramHash.flip)
+
+  def deleteByParamHash(paramHash: Sha256DigestBE): Future[Int] = {
+    val q = table.filter(_.paramHash === paramHash)
+    safeDatabase.run(q.delete)
+  }
+
+  class DLCCETSignatureTable(tag: Tag)
+      extends Table[DLCCETSignatureDb](tag, "wallet_dlc_cet_sigs") {
+
+    def paramHash: Rep[Sha256DigestBE] = column("param_hash")
+
+    def isInitiator: Rep[Boolean] = column("is_initiator")
+
+    def outcome: Rep[DLCOutcomeType] = column("outcome")
+
+    def signature: Rep[ECAdaptorSignature] = column("signature")
+
+    def * : ProvenShape[DLCCETSignatureDb] =
+      (paramHash, isInitiator, outcome, signature).<>(DLCCETSignatureDb.tupled,
+                                                      DLCCETSignatureDb.unapply)
+
+    def primaryKey: PrimaryKey =
+      primaryKey(name = "pk_dlc_cet_sigs",
+                 sourceColumns = (paramHash, isInitiator, outcome))
+
+    def fk: ForeignKeyQuery[_, DLCDb] =
+      foreignKey("fk_param_hash",
+                 sourceColumns = paramHash,
+                 targetTableQuery = dlcTable)(_.paramHash)
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCCETSignatureDb.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCCETSignatureDb.scala
new file mode 100644
index 0000000000..213e1c5cde
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCCETSignatureDb.scala
@@ -0,0 +1,12 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.crypto.{ECAdaptorSignature, Sha256DigestBE}
+
+case class DLCCETSignatureDb(
+    paramHash: Sha256DigestBE,
+    isInitiator: Boolean,
+    outcome: DLCOutcomeType,
+    signature: ECAdaptorSignature) {
+  def toTuple: (DLCOutcomeType, ECAdaptorSignature) = (outcome, signature)
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCDAO.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCDAO.scala
new file mode 100644
index 0000000000..919fb995cd
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCDAO.scala
@@ -0,0 +1,167 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCState
+import org.bitcoins.core.hd.HDAccount
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.protocol.transaction.TransactionOutPoint
+import org.bitcoins.crypto.{
+  DoubleSha256DigestBE,
+  SchnorrDigitalSignature,
+  Sha256Digest,
+  Sha256DigestBE
+}
+import org.bitcoins.db.{CRUD, SlickUtil}
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import scodec.bits.ByteVector
+import slick.lifted.{PrimaryKey, ProvenShape}
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCDAO()(implicit
+    val ec: ExecutionContext,
+    override val appConfig: DLCAppConfig)
+    extends CRUD[DLCDb, Sha256DigestBE]
+    with SlickUtil[DLCDb, Sha256DigestBE] {
+  private val mappers = new org.bitcoins.db.DbCommonsColumnMappers(profile)
+  import mappers._
+  import profile.api._
+
+  override val table: TableQuery[DLCTable] = TableQuery[DLCTable]
+
+  override def createAll(ts: Vector[DLCDb]): Future[Vector[DLCDb]] =
+    createAllNoAutoInc(ts, safeDatabase)
+
+  override protected def findByPrimaryKeys(
+      ids: Vector[Sha256DigestBE]): Query[DLCTable, DLCDb, Seq] =
+    table.filter(_.paramHash.inSet(ids))
+
+  override def findByPrimaryKey(
+      id: Sha256DigestBE): Query[DLCTable, DLCDb, Seq] = {
+    table
+      .filter(_.paramHash === id)
+  }
+
+  override def findAll(dlcs: Vector[DLCDb]): Query[DLCTable, DLCDb, Seq] =
+    findByPrimaryKeys(dlcs.map(_.paramHash))
+
+  def findByTempContractId(
+      tempContractId: Sha256Digest): Future[Option[DLCDb]] = {
+    val q = table.filter(_.tempContractId === tempContractId)
+
+    safeDatabase.run(q.result).map {
+      case h +: Vector() =>
+        Some(h)
+      case Vector() =>
+        None
+      case dlcs: Vector[DLCDb] =>
+        throw new RuntimeException(
+          s"More than one DLC per tempContractId (${tempContractId.hex}), got: $dlcs")
+    }
+  }
+
+  def findByTempContractId(
+      tempContractId: Sha256DigestBE): Future[Option[DLCDb]] =
+    findByTempContractId(tempContractId.flip)
+
+  def findByContractId(contractId: ByteVector): Future[Option[DLCDb]] = {
+    val q = table.filter(_.contractId === contractId)
+
+    safeDatabase.run(q.result).map {
+      case h +: Vector() =>
+        Some(h)
+      case Vector() =>
+        None
+      case dlcs: Vector[DLCDb] =>
+        throw new RuntimeException(
+          s"More than one DLC per contractId (${contractId.toHex}), got: $dlcs")
+    }
+  }
+
+  def findByParamHash(paramHash: Sha256DigestBE): Future[Option[DLCDb]] = {
+    val q = table.filter(_.paramHash === paramHash)
+
+    safeDatabase.run(q.result).map {
+      case h +: Vector() =>
+        Some(h)
+      case Vector() =>
+        None
+      case dlcs: Vector[DLCDb] =>
+        throw new RuntimeException(
+          s"More than one DLC per paramHash (${paramHash.hex}), got: $dlcs")
+    }
+  }
+
+  def findByParamHash(paramHash: Sha256Digest): Future[Option[DLCDb]] =
+    findByParamHash(paramHash.flip)
+
+  def findByFundingOutPoint(
+      outPoint: TransactionOutPoint): Future[Option[DLCDb]] = {
+    val q = table.filter(_.fundingOutPointOpt === outPoint)
+
+    safeDatabase.run(q.result).map(_.headOption)
+  }
+
+  def findByFundingOutPoints(
+      outPoints: Vector[TransactionOutPoint]): Future[Vector[DLCDb]] = {
+    val q = table.filter(_.fundingOutPointOpt.inSet(outPoints))
+
+    safeDatabase.runVec(q.result)
+  }
+
+  def findByFundingTxIds(
+      txIds: Vector[DoubleSha256DigestBE]): Future[Vector[DLCDb]] = {
+    val q = table.filter(_.fundingTxIdOpt.inSet(txIds))
+
+    safeDatabase.runVec(q.result)
+  }
+
+  class DLCTable(tag: Tag) extends Table[DLCDb](tag, "wallet_dlcs") {
+
+    def paramHash: Rep[Sha256DigestBE] = column("param_hash", O.PrimaryKey)
+
+    def tempContractId: Rep[Sha256Digest] =
+      column("temp_contract_id", O.Unique)
+
+    def contractId: Rep[Option[ByteVector]] =
+      column("contract_id", O.Unique)
+
+    def state: Rep[DLCState] = column("state")
+
+    def isInitiator: Rep[Boolean] = column("is_initiator")
+
+    def account: Rep[HDAccount] = column("account")
+
+    def keyIndex: Rep[Int] = column("key_index")
+
+    def oracleSigsOpt: Rep[Option[Vector[SchnorrDigitalSignature]]] =
+      column("oracle_sigs")
+
+    def fundingOutPointOpt: Rep[Option[TransactionOutPoint]] =
+      column("funding_outpoint")
+
+    def fundingTxIdOpt: Rep[Option[DoubleSha256DigestBE]] =
+      column("funding_tx_id")
+
+    def closingTxIdOpt: Rep[Option[DoubleSha256DigestBE]] =
+      column("closing_tx_id")
+
+    def outcomeOpt: Rep[Option[DLCOutcomeType]] = column("outcome")
+
+    def * : ProvenShape[DLCDb] =
+      (paramHash,
+       tempContractId,
+       contractId,
+       state,
+       isInitiator,
+       account,
+       keyIndex,
+       oracleSigsOpt,
+       fundingOutPointOpt,
+       fundingTxIdOpt,
+       closingTxIdOpt,
+       outcomeOpt).<>(DLCDb.tupled, DLCDb.unapply)
+
+    def primaryKey: PrimaryKey =
+      primaryKey(name = "pk_dlc", sourceColumns = paramHash)
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCDb.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCDb.scala
new file mode 100644
index 0000000000..908eb206c0
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCDb.scala
@@ -0,0 +1,38 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCState
+import org.bitcoins.core.hd.HDAccount
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.protocol.transaction.TransactionOutPoint
+import org.bitcoins.crypto.{
+  DoubleSha256DigestBE,
+  SchnorrDigitalSignature,
+  Sha256Digest,
+  Sha256DigestBE
+}
+import scodec.bits.ByteVector
+
+case class DLCDb(
+    paramHash: Sha256DigestBE,
+    tempContractId: Sha256Digest,
+    contractIdOpt: Option[ByteVector],
+    state: DLCState,
+    isInitiator: Boolean,
+    account: HDAccount,
+    keyIndex: Int,
+    oracleSigsOpt: Option[Vector[SchnorrDigitalSignature]],
+    fundingOutPointOpt: Option[TransactionOutPoint],
+    fundingTxIdOpt: Option[DoubleSha256DigestBE],
+    closingTxIdOpt: Option[DoubleSha256DigestBE],
+    outcomeOpt: Option[DLCOutcomeType]
+) {
+
+  def updateState(newState: DLCState): DLCDb = {
+    copy(state = newState)
+  }
+
+  def updateFundingOutPoint(outPoint: TransactionOutPoint): DLCDb = {
+    copy(fundingOutPointOpt = Some(outPoint),
+         fundingTxIdOpt = Some(outPoint.txIdBE))
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCFundingInputDAO.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCFundingInputDAO.scala
new file mode 100644
index 0000000000..6680ee4445
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCFundingInputDAO.scala
@@ -0,0 +1,114 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.core.protocol.script.{ScriptPubKey, ScriptWitness}
+import org.bitcoins.core.protocol.transaction.{
+  TransactionOutPoint,
+  TransactionOutput
+}
+import org.bitcoins.crypto.{Sha256Digest, Sha256DigestBE}
+import org.bitcoins.db.{CRUD, SlickUtil}
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import slick.lifted.{ForeignKeyQuery, PrimaryKey, ProvenShape}
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCFundingInputDAO()(implicit
+    val ec: ExecutionContext,
+    override val appConfig: DLCAppConfig)
+    extends CRUD[DLCFundingInputDb, TransactionOutPoint]
+    with SlickUtil[DLCFundingInputDb, TransactionOutPoint] {
+  private val mappers = new org.bitcoins.db.DbCommonsColumnMappers(profile)
+  import mappers._
+  import profile.api._
+
+  override val table: TableQuery[DLCFundingInputsTable] =
+    TableQuery[DLCFundingInputsTable]
+
+  private lazy val dlcTable: slick.lifted.TableQuery[DLCDAO#DLCTable] = {
+    DLCDAO().table
+  }
+
+  override def createAll(
+      ts: Vector[DLCFundingInputDb]): Future[Vector[DLCFundingInputDb]] =
+    createAllNoAutoInc(ts, safeDatabase)
+
+  override protected def findByPrimaryKeys(
+      outPoints: Vector[TransactionOutPoint]): Query[
+    DLCFundingInputsTable,
+    DLCFundingInputDb,
+    Seq] =
+    table.filter(_.outPoint.inSet(outPoints))
+
+  override def findByPrimaryKey(outPoint: TransactionOutPoint): Query[
+    DLCFundingInputsTable,
+    DLCFundingInputDb,
+    Seq] = {
+    table
+      .filter(_.outPoint === outPoint)
+  }
+
+  override def findAll(dlcs: Vector[DLCFundingInputDb]): Query[
+    DLCFundingInputsTable,
+    DLCFundingInputDb,
+    Seq] =
+    findByPrimaryKeys(dlcs.map(_.outPoint))
+
+  def findByParamHash(
+      paramHash: Sha256DigestBE): Future[Vector[DLCFundingInputDb]] = {
+    val q = table.filter(_.paramHash === paramHash)
+
+    safeDatabase.run(q.result).map(_.toVector)
+  }
+
+  def findByParamHash(
+      paramHash: Sha256Digest): Future[Vector[DLCFundingInputDb]] =
+    findByParamHash(paramHash.flip)
+
+  def findByParamHash(
+      paramHash: Sha256DigestBE,
+      isInitiator: Boolean): Future[Vector[DLCFundingInputDb]] = {
+    val q = table
+      .filter(_.paramHash === paramHash)
+      .filter(_.isInitiator === isInitiator)
+
+    safeDatabase.run(q.result).map(_.toVector)
+  }
+
+  def findByParamHash(
+      paramHash: Sha256Digest,
+      isInitiator: Boolean): Future[Vector[DLCFundingInputDb]] =
+    findByParamHash(paramHash.flip, isInitiator)
+
+  class DLCFundingInputsTable(tag: Tag)
+      extends Table[DLCFundingInputDb](tag, "wallet_dlc_funding_inputs") {
+
+    def paramHash: Rep[Sha256DigestBE] = column("param_hash")
+
+    def isInitiator: Rep[Boolean] = column("is_initiator")
+
+    def outPoint: Rep[TransactionOutPoint] = column("out_point", O.Unique)
+
+    def output: Rep[TransactionOutput] = column("output")
+
+    def redeemScriptOpt: Rep[Option[ScriptPubKey]] = column("redeem_script_opt")
+
+    def witnessScriptOpt: Rep[Option[ScriptWitness]] =
+      column("witness_script_opt")
+
+    def * : ProvenShape[DLCFundingInputDb] =
+      (paramHash,
+       isInitiator,
+       outPoint,
+       output,
+       redeemScriptOpt,
+       witnessScriptOpt).<>(DLCFundingInputDb.tupled, DLCFundingInputDb.unapply)
+
+    def primaryKey: PrimaryKey =
+      primaryKey(name = "pk_dlc_input", sourceColumns = outPoint)
+
+    def fk: ForeignKeyQuery[_, DLCDb] =
+      foreignKey("fk_param_hash",
+                 sourceColumns = paramHash,
+                 targetTableQuery = dlcTable)(_.paramHash)
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCFundingInputDb.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCFundingInputDb.scala
new file mode 100644
index 0000000000..82a5af4421
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCFundingInputDb.scala
@@ -0,0 +1,32 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.commons.jsonmodels.dlc.{
+  DLCFundingInput,
+  DLCFundingInputP2WPKHV0
+}
+import org.bitcoins.core.protocol.script.{ScriptPubKey, ScriptWitness}
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.crypto.Sha256DigestBE
+
+case class DLCFundingInputDb(
+    paramHash: Sha256DigestBE,
+    isInitiator: Boolean,
+    outPoint: TransactionOutPoint,
+    output: TransactionOutput,
+    redeemScriptOpt: Option[ScriptPubKey],
+    witnessScriptOpt: Option[ScriptWitness]) {
+
+  lazy val toOutputReference: OutputReference =
+    OutputReference(outPoint, output)
+
+  def toFundingInput(prevTx: Transaction): DLCFundingInput = {
+    require(
+      prevTx.txId == outPoint.txId,
+      s"Provided previous transaction didn't match database outpoint outpoint=${outPoint.txIdBE.hex} prevTx.txId=${prevTx.txIdBE.hex}"
+    )
+
+    DLCFundingInputP2WPKHV0(prevTx,
+                            outPoint.vout,
+                            TransactionConstants.sequence)
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCOfferDAO.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCOfferDAO.scala
new file mode 100644
index 0000000000..37660fb23d
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCOfferDAO.scala
@@ -0,0 +1,115 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.protocol.tlv.{ContractInfoTLV, OracleInfoTLV}
+import org.bitcoins.core.protocol.{BitcoinAddress, BlockTimeStamp}
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto._
+import org.bitcoins.db.{CRUD, SlickUtil}
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import slick.lifted.{ForeignKeyQuery, PrimaryKey, ProvenShape}
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCOfferDAO()(implicit
+    val ec: ExecutionContext,
+    override val appConfig: DLCAppConfig)
+    extends CRUD[DLCOfferDb, Sha256DigestBE]
+    with SlickUtil[DLCOfferDb, Sha256DigestBE] {
+  private val mappers = new org.bitcoins.db.DbCommonsColumnMappers(profile)
+  import mappers._
+  import profile.api._
+
+  override val table: TableQuery[DLCOfferTable] = TableQuery[DLCOfferTable]
+
+  private lazy val dlcTable: slick.lifted.TableQuery[DLCDAO#DLCTable] = {
+    DLCDAO().table
+  }
+
+  override def createAll(ts: Vector[DLCOfferDb]): Future[Vector[DLCOfferDb]] =
+    createAllNoAutoInc(ts, safeDatabase)
+
+  override protected def findByPrimaryKeys(
+      ids: Vector[Sha256DigestBE]): Query[DLCOfferTable, DLCOfferDb, Seq] =
+    table.filter(_.paramHash.inSet(ids))
+
+  override def findByPrimaryKey(
+      id: Sha256DigestBE): Query[DLCOfferTable, DLCOfferDb, Seq] = {
+    table
+      .filter(_.paramHash === id)
+  }
+
+  override def findAll(
+      dlcs: Vector[DLCOfferDb]): Query[DLCOfferTable, DLCOfferDb, Seq] =
+    findByPrimaryKeys(dlcs.map(_.paramHash))
+
+  def findByParamHash(paramHash: Sha256DigestBE): Future[Option[DLCOfferDb]] = {
+    val q = table.filter(_.paramHash === paramHash)
+
+    safeDatabase.run(q.result).map {
+      case h +: Vector() =>
+        Some(h)
+      case Vector() =>
+        None
+      case dlcs: Vector[DLCOfferDb] =>
+        throw new RuntimeException(
+          s"More than one DLCOffer per paramHash ($paramHash), got: $dlcs")
+    }
+  }
+
+  def findByParamHash(paramHash: Sha256Digest): Future[Option[DLCOfferDb]] =
+    findByParamHash(paramHash.flip)
+
+  class DLCOfferTable(tag: Tag)
+      extends Table[DLCOfferDb](tag, "wallet_dlc_offers") {
+
+    def paramHash: Rep[Sha256DigestBE] = column("param_hash", O.Unique)
+
+    def tempContractId: Rep[Sha256Digest] =
+      column("temp_contract_id", O.Unique)
+
+    def oracleInfoTLV: Rep[OracleInfoTLV] = column("oracle_info_tlv")
+
+    def contractInfoTLV: Rep[ContractInfoTLV] = column("contract_info")
+
+    def contractMaturity: Rep[BlockTimeStamp] = column("contract_maturity")
+
+    def contractTimeout: Rep[BlockTimeStamp] = column("contract_timeout")
+
+    def fundingKey: Rep[ECPublicKey] = column("funding_key")
+
+    def payoutAddress: Rep[BitcoinAddress] = column("payout_address")
+
+    def totalCollateral: Rep[CurrencyUnit] = column("total_collateral")
+
+    def feeRate: Rep[SatoshisPerVirtualByte] = column("fee_rate")
+
+    def changeAddress: Rep[BitcoinAddress] = column("change_address")
+
+    def * : ProvenShape[DLCOfferDb] =
+      (paramHash,
+       tempContractId,
+       oracleInfoTLV,
+       contractInfoTLV,
+       contractMaturity,
+       contractTimeout,
+       fundingKey,
+       payoutAddress,
+       totalCollateral,
+       feeRate,
+       changeAddress).<>(DLCOfferDb.tupled, DLCOfferDb.unapply)
+
+    def primaryKey: PrimaryKey =
+      primaryKey(name = "pk_dlc_offer", sourceColumns = paramHash)
+
+    def fk: ForeignKeyQuery[_, DLCDb] =
+      foreignKey("fk_paramHash",
+                 sourceColumns = paramHash,
+                 targetTableQuery = dlcTable)(_.paramHash)
+
+    def fkTempContractId: ForeignKeyQuery[_, DLCDb] =
+      foreignKey("fk_temp_contract_id",
+                 sourceColumns = tempContractId,
+                 targetTableQuery = dlcTable)(_.tempContractId)
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCOfferDb.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCOfferDb.scala
new file mode 100644
index 0000000000..a3e231a098
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCOfferDb.scala
@@ -0,0 +1,68 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc.{
+  DLCFundingInput,
+  DLCPublicKeys,
+  DLCTimeouts
+}
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.protocol.tlv.{ContractInfoTLV, OracleInfoTLV}
+import org.bitcoins.core.protocol.{BitcoinAddress, BlockTimeStamp}
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto._
+
+case class DLCOfferDb(
+    paramHash: Sha256DigestBE,
+    tempContractId: Sha256Digest,
+    oracleInfoTLV: OracleInfoTLV,
+    contractInfoTLV: ContractInfoTLV,
+    contractMaturity: BlockTimeStamp,
+    contractTimeout: BlockTimeStamp,
+    fundingKey: ECPublicKey,
+    payoutAddress: BitcoinAddress,
+    totalCollateral: CurrencyUnit,
+    feeRate: SatoshisPerVirtualByte,
+    changeAddress: BitcoinAddress) {
+
+  lazy val oracleInfo: OracleInfo = OracleInfo.fromTLV(oracleInfoTLV)
+
+  lazy val contractInfo: ContractInfo = ContractInfo.fromTLV(contractInfoTLV)
+
+  lazy val dlcPubKeys: DLCPublicKeys = DLCPublicKeys(fundingKey, payoutAddress)
+
+  lazy val dlcTimeouts: DLCTimeouts =
+    DLCTimeouts(contractMaturity, contractTimeout)
+
+  def toDLCOffer(fundingInputs: Vector[DLCFundingInput]): DLCOffer = {
+
+    DLCOffer(
+      OracleAndContractInfo(oracleInfo, contractInfo),
+      dlcPubKeys,
+      totalCollateral.satoshis,
+      fundingInputs,
+      changeAddress,
+      feeRate,
+      dlcTimeouts
+    )
+  }
+}
+
+object DLCOfferDbHelper {
+
+  def fromDLCOffer(offer: DLCOffer): DLCOfferDb = {
+    DLCOfferDb(
+      offer.paramHash,
+      offer.tempContractId,
+      offer.oracleInfo.toTLV,
+      offer.contractInfo.toTLV,
+      offer.timeouts.contractMaturity,
+      offer.timeouts.contractTimeout,
+      offer.pubKeys.fundingKey,
+      offer.pubKeys.payoutAddress,
+      offer.totalCollateral,
+      offer.feeRate,
+      offer.changeAddress
+    )
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRefundSigDAO.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRefundSigDAO.scala
new file mode 100644
index 0000000000..f8c42407a3
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRefundSigDAO.scala
@@ -0,0 +1,93 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.crypto.{Sha256Digest, Sha256DigestBE}
+import org.bitcoins.db.{CRUD, SlickUtil}
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import slick.lifted.{ForeignKeyQuery, PrimaryKey, ProvenShape}
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCRefundSigDAO()(implicit
+    val ec: ExecutionContext,
+    override val appConfig: DLCAppConfig)
+    extends CRUD[DLCRefundSigDb, (Sha256DigestBE, Boolean)]
+    with SlickUtil[DLCRefundSigDb, (Sha256DigestBE, Boolean)] {
+  private val mappers = new org.bitcoins.db.DbCommonsColumnMappers(profile)
+  import mappers._
+  import profile.api._
+
+  override val table: TableQuery[DLCRefundSigTable] =
+    TableQuery[DLCRefundSigTable]
+
+  private lazy val dlcTable: slick.lifted.TableQuery[DLCDAO#DLCTable] = {
+    DLCDAO().table
+  }
+
+  override def createAll(
+      ts: Vector[DLCRefundSigDb]): Future[Vector[DLCRefundSigDb]] =
+    createAllNoAutoInc(ts, safeDatabase)
+
+  override protected def findByPrimaryKeys(ids: Vector[
+    (Sha256DigestBE, Boolean)]): Query[DLCRefundSigTable, DLCRefundSigDb, Seq] =
+    table.filter(_.paramHash.inSet(ids.map(_._1)))
+
+  override def findByPrimaryKey(id: (Sha256DigestBE, Boolean)): Query[
+    DLCRefundSigTable,
+    DLCRefundSigDb,
+    Seq] = {
+    val (paramHash, isInit) = id
+    table
+      .filter(_.paramHash === paramHash)
+      .filter(_.isInitiator === isInit)
+  }
+
+  override def findAll(dlcs: Vector[DLCRefundSigDb]): Query[
+    DLCRefundSigTable,
+    DLCRefundSigDb,
+    Seq] =
+    findByPrimaryKeys(dlcs.map(dlc => (dlc.paramHash, dlc.isInitiator)))
+
+  def findByParamHash(
+      paramHash: Sha256DigestBE): Future[Vector[DLCRefundSigDb]] = {
+    val q = table.filter(_.paramHash === paramHash)
+
+    safeDatabase.runVec(q.result)
+  }
+
+  def findByParamHash(
+      paramHash: Sha256DigestBE,
+      isInit: Boolean): Future[Option[DLCRefundSigDb]] = {
+    val q = table
+      .filter(_.paramHash === paramHash)
+      .filter(_.isInitiator === isInit)
+
+    safeDatabase.runVec(q.result).map(_.headOption)
+  }
+
+  def findByParamHash(paramHash: Sha256Digest): Future[Vector[DLCRefundSigDb]] =
+    findByParamHash(paramHash.flip)
+
+  class DLCRefundSigTable(tag: Tag)
+      extends Table[DLCRefundSigDb](tag, "wallet_dlc_refund_sigs") {
+
+    def paramHash: Rep[Sha256DigestBE] = column("param_hash")
+
+    def isInitiator: Rep[Boolean] = column("is_initiator")
+
+    def refundSig: Rep[PartialSignature] = column("refund_sig")
+
+    def * : ProvenShape[DLCRefundSigDb] =
+      (paramHash, isInitiator, refundSig).<>(DLCRefundSigDb.tupled,
+                                             DLCRefundSigDb.unapply)
+
+    def primaryKey: PrimaryKey =
+      primaryKey(name = "pk_dlc_refund_sig",
+                 sourceColumns = (paramHash, isInitiator))
+
+    def fk: ForeignKeyQuery[_, DLCDb] =
+      foreignKey("fk_param_hash",
+                 sourceColumns = paramHash,
+                 targetTableQuery = dlcTable)(_.paramHash)
+  }
+}
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRefundSigDb.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRefundSigDb.scala
new file mode 100644
index 0000000000..c2e825fb7d
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRefundSigDb.scala
@@ -0,0 +1,9 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.crypto.Sha256DigestBE
+
+case class DLCRefundSigDb(
+    paramHash: Sha256DigestBE,
+    isInitiator: Boolean,
+    refundSig: PartialSignature)
diff --git a/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRemoteTxDAO.scala b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRemoteTxDAO.scala
new file mode 100644
index 0000000000..5edac25001
--- /dev/null
+++ b/dlc-wallet/src/main/scala/org/bitcoins/dlc/wallet/models/DLCRemoteTxDAO.scala
@@ -0,0 +1,60 @@
+package org.bitcoins.dlc.wallet.models
+
+import org.bitcoins.core.api.wallet.db.TransactionDb
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.transaction.Transaction
+import org.bitcoins.crypto.DoubleSha256DigestBE
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import org.bitcoins.wallet.models.TxDAO
+import slick.lifted.{PrimaryKey, ProvenShape}
+
+import scala.concurrent.ExecutionContext
+
+case class DLCRemoteTxDAO()(implicit
+    val ec: ExecutionContext,
+    override val appConfig: DLCAppConfig)
+    extends TxDAO[TransactionDb] {
+
+  import profile.api._
+  private val mappers = new org.bitcoins.db.DbCommonsColumnMappers(profile)
+  import mappers._
+
+  override val table = TableQuery[DLCRemoteTxTable]
+
+  class DLCRemoteTxTable(tag: Tag)
+      extends TxTable[TransactionDb](tag, schemaName, "dlc_remote_tx_table") {
+    def txIdBE: Rep[DoubleSha256DigestBE] = column("txIdBE", O.PrimaryKey)
+
+    def transaction: Rep[Transaction] = column("transaction")
+
+    def unsignedTxIdBE: Rep[DoubleSha256DigestBE] = column("unsignedTxIdBE")
+
+    def unsignedTx: Rep[Transaction] = column("unsignedTx")
+
+    def wTxIdBEOpt: Rep[Option[DoubleSha256DigestBE]] =
+      column("wTxIdBE")
+
+    def totalOutput: Rep[CurrencyUnit] = column("totalOutput")
+
+    def numInputs: Rep[Int] = column("numInputs")
+
+    def numOutputs: Rep[Int] = column("numOutputs")
+
+    def locktime: Rep[UInt32] = column("locktime")
+
+    def * : ProvenShape[TransactionDb] =
+      (txIdBE,
+       transaction,
+       unsignedTxIdBE,
+       unsignedTx,
+       wTxIdBEOpt,
+       totalOutput,
+       numInputs,
+       numOutputs,
+       locktime).<>(TransactionDb.tupled, TransactionDb.unapply)
+
+    def primaryKey: PrimaryKey =
+      primaryKey("pk_tx", sourceColumns = txIdBE)
+  }
+}
diff --git a/dlc/README.md b/dlc/README.md
new file mode 100644
index 0000000000..503fa1da06
--- /dev/null
+++ b/dlc/README.md
@@ -0,0 +1 @@
+#TODO
\ No newline at end of file
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCCETBuilder.scala b/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCCETBuilder.scala
new file mode 100644
index 0000000000..8aa00dfd39
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCCETBuilder.scala
@@ -0,0 +1,79 @@
+package org.bitcoins.dlc.builder
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.OracleAndContractInfo
+import org.bitcoins.commons.jsonmodels.dlc.DLCTimeouts
+import org.bitcoins.core.protocol.script.{
+  EmptyScriptSignature,
+  MultiSignatureScriptPubKey,
+  P2WSHWitnessV0,
+  ScriptPubKey
+}
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.wallet.builder.{
+  AddWitnessDataFinalizer,
+  FilterDustFinalizer,
+  RawTxBuilder
+}
+import org.bitcoins.core.wallet.fee.FeeUnit
+import org.bitcoins.core.wallet.utxo.{ConditionalPath, P2WSHV0InputInfo}
+import org.bitcoins.crypto.ECPublicKey
+
+import scala.concurrent.{ExecutionContext, Future}
+
+/** Responsible for constructing unsigned
+  * Contract Execution Transactions (CETs)
+  */
+case class DLCCETBuilder(
+    oracleAndContractInfo: OracleAndContractInfo,
+    offerFundingKey: ECPublicKey,
+    offerFinalSPK: ScriptPubKey,
+    acceptFundingKey: ECPublicKey,
+    acceptFinalSPK: ScriptPubKey,
+    timeouts: DLCTimeouts,
+    feeRate: FeeUnit,
+    fundingOutputRef: OutputReference) {
+
+  private val fundingOutPoint = fundingOutputRef.outPoint
+
+  private val fundingKeys =
+    Vector(offerFundingKey, acceptFundingKey).sortBy(_.hex)
+
+  private val fundingInfo = P2WSHV0InputInfo(
+    outPoint = fundingOutPoint,
+    amount = fundingOutputRef.output.value,
+    scriptWitness = P2WSHWitnessV0(MultiSignatureScriptPubKey(2, fundingKeys)),
+    conditionalPath = ConditionalPath.NoCondition
+  )
+
+  /** Constructs a Contract Execution Transaction (CET)
+    * for a given outcome hash
+    */
+  def buildCET(msg: DLCOutcomeType)(implicit
+      ec: ExecutionContext): Future[WitnessTransaction] = {
+    val builder = RawTxBuilder().setLockTime(timeouts.contractMaturity.toUInt32)
+
+    val (offerValue, acceptValue) = oracleAndContractInfo.getPayouts(msg)
+
+    builder += TransactionOutput(offerValue, offerFinalSPK)
+    builder += TransactionOutput(acceptValue, acceptFinalSPK)
+
+    builder += TransactionInput(fundingOutPoint,
+                                EmptyScriptSignature,
+                                TransactionConstants.disableRBFSequence)
+
+    val finalizer =
+      FilterDustFinalizer
+        .andThen(AddWitnessDataFinalizer(Vector(fundingInfo)))
+
+    val txF = finalizer.buildTx(builder.result())
+
+    txF.flatMap {
+      case _: NonWitnessTransaction =>
+        Future.failed(
+          new RuntimeException(
+            "Something went wrong with AddWitnessDataFinalizer"))
+      case wtx: WitnessTransaction => Future.successful(wtx)
+    }
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCFundingTxBuilder.scala b/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCFundingTxBuilder.scala
new file mode 100644
index 0000000000..17554cda1a
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCFundingTxBuilder.scala
@@ -0,0 +1,109 @@
+package org.bitcoins.dlc.builder
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCFundingInput
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.protocol.script.{
+  EmptyScriptSignature,
+  MultiSignatureScriptPubKey,
+  P2SHScriptSignature,
+  P2WSHWitnessSPKV0,
+  ScriptPubKey
+}
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.wallet.builder.{
+  DualFundingTxFinalizer,
+  RawTxBuilderWithFinalizer
+}
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto.ECPublicKey
+
+import scala.concurrent.{ExecutionContext, Future}
+
+/** Responsible for constructing an unsigned DLC funding transaction
+  * as well as all of its components (ScriptPubKeys, etc.)
+  */
+case class DLCFundingTxBuilder(
+    offerFundingKey: ECPublicKey,
+    acceptFundingKey: ECPublicKey,
+    feeRate: SatoshisPerVirtualByte,
+    offerInput: CurrencyUnit,
+    acceptInput: CurrencyUnit,
+    offerFundingInputs: Vector[DLCFundingInput],
+    acceptFundingInputs: Vector[DLCFundingInput],
+    offerChangeSPK: ScriptPubKey,
+    acceptChangeSPK: ScriptPubKey,
+    offerPayoutSPK: ScriptPubKey,
+    acceptPayoutSPK: ScriptPubKey) {
+
+  /** The total collateral of both parties combined */
+  val totalInput: CurrencyUnit = offerInput + acceptInput
+
+  /** The sum of all funding input amounts from the initiator */
+  val offerTotalFunding: CurrencyUnit =
+    offerFundingInputs.map(_.output.value).sum
+
+  /** The sum of all funding input amounts from the non-initiator */
+  val acceptTotalFunding: CurrencyUnit =
+    acceptFundingInputs.map(_.output.value).sum
+
+  require(
+    offerTotalFunding >= offerInput,
+    "Offer funding inputs must add up to at least offer's total collateral")
+  require(
+    acceptTotalFunding >= acceptInput,
+    "Accept funding inputs must add up to at least accept's total collateral")
+
+  private val fundingKeys =
+    Vector(offerFundingKey, acceptFundingKey).sortBy(_.hex)
+
+  /** The 2-of-2 MultiSignatureScriptPubKey to be wrapped in P2WSH and used as the funding output */
+  val fundingMultiSig: MultiSignatureScriptPubKey =
+    MultiSignatureScriptPubKey(2, fundingKeys)
+
+  /** The funding output's P2WSH(MultiSig) ScriptPubKey */
+  val fundingSPK: P2WSHWitnessSPKV0 = P2WSHWitnessSPKV0(fundingMultiSig)
+
+  val fundingTxFinalizer: DualFundingTxFinalizer = DualFundingTxFinalizer(
+    offerInputs = offerFundingInputs.map(_.toDualFundingInput),
+    offerPayoutSPK = offerPayoutSPK,
+    offerChangeSPK = offerChangeSPK,
+    acceptInputs = acceptFundingInputs.map(_.toDualFundingInput),
+    acceptPayoutSPK = acceptPayoutSPK,
+    acceptChangeSPK = acceptChangeSPK,
+    feeRate = feeRate,
+    fundingSPK = fundingSPK
+  )
+
+  def buildFundingTx()(implicit ec: ExecutionContext): Future[Transaction] = {
+    val builder = RawTxBuilderWithFinalizer(fundingTxFinalizer)
+
+    builder += TransactionOutput(totalInput, fundingSPK)
+    builder += TransactionOutput(offerTotalFunding - offerInput, offerChangeSPK)
+    builder += TransactionOutput(acceptTotalFunding - acceptInput,
+                                 acceptChangeSPK)
+
+    offerFundingInputs.foreach { ref =>
+      val scriptSig = ref.redeemScriptOpt match {
+        case Some(redeemScript) => P2SHScriptSignature(redeemScript)
+        case None               => EmptyScriptSignature
+      }
+
+      builder += TransactionInput(ref.outPoint,
+                                  scriptSig,
+                                  TransactionConstants.sequence)
+    }
+
+    acceptFundingInputs.foreach { ref =>
+      val scriptSig = ref.redeemScriptOpt match {
+        case Some(redeemScript) => P2SHScriptSignature(redeemScript)
+        case None               => EmptyScriptSignature
+      }
+
+      builder += TransactionInput(ref.outPoint,
+                                  scriptSig,
+                                  TransactionConstants.sequence)
+    }
+
+    builder.buildTx()
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCRefundTxBuilder.scala b/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCRefundTxBuilder.scala
new file mode 100644
index 0000000000..54b4668d5d
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCRefundTxBuilder.scala
@@ -0,0 +1,66 @@
+package org.bitcoins.dlc.builder
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCTimeouts
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.protocol.script.{
+  EmptyScriptSignature,
+  MultiSignatureScriptPubKey,
+  P2WSHWitnessV0,
+  ScriptPubKey
+}
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.wallet.builder.{AddWitnessDataFinalizer, RawTxBuilder}
+import org.bitcoins.core.wallet.fee.FeeUnit
+import org.bitcoins.core.wallet.utxo.{ConditionalPath, P2WSHV0InputInfo}
+import org.bitcoins.crypto.ECPublicKey
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCRefundTxBuilder(
+    offerInput: CurrencyUnit,
+    offerFundingKey: ECPublicKey,
+    offerFinalSPK: ScriptPubKey,
+    acceptInput: CurrencyUnit,
+    acceptFundingKey: ECPublicKey,
+    acceptFinalSPK: ScriptPubKey,
+    fundingOutputRef: OutputReference,
+    timeouts: DLCTimeouts,
+    feeRate: FeeUnit) {
+  private val OutputReference(fundingOutPoint, fundingOutput) = fundingOutputRef
+
+  private val fundingKeys =
+    Vector(offerFundingKey, acceptFundingKey).sortBy(_.hex)
+
+  private val fundingInfo = P2WSHV0InputInfo(
+    outPoint = fundingOutPoint,
+    amount = fundingOutput.value,
+    scriptWitness = P2WSHWitnessV0(MultiSignatureScriptPubKey(2, fundingKeys)),
+    conditionalPath = ConditionalPath.NoCondition
+  )
+
+  /** Constructs the unsigned DLC refund transaction */
+  def buildRefundTx()(implicit
+      ec: ExecutionContext): Future[WitnessTransaction] = {
+
+    val builder = RawTxBuilder().setLockTime(timeouts.contractTimeout.toUInt32)
+
+    builder += TransactionInput(fundingOutPoint,
+                                EmptyScriptSignature,
+                                TransactionConstants.disableRBFSequence)
+
+    builder += TransactionOutput(offerInput, offerFinalSPK)
+    builder += TransactionOutput(acceptInput, acceptFinalSPK)
+
+    val finalizer = AddWitnessDataFinalizer(Vector(fundingInfo))
+
+    val txF = finalizer.buildTx(builder.result())
+
+    txF.flatMap {
+      case _: NonWitnessTransaction =>
+        Future.failed(
+          new RuntimeException(
+            "Something went wrong with AddWitnessDataFinalizer"))
+      case wtx: WitnessTransaction => Future.successful(wtx)
+    }
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCTxBuilder.scala b/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCTxBuilder.scala
new file mode 100644
index 0000000000..9e065c9b50
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/builder/DLCTxBuilder.scala
@@ -0,0 +1,171 @@
+package org.bitcoins.dlc.builder
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc.{
+  DLCFundingInput,
+  DLCPublicKeys,
+  DLCTimeouts
+}
+import org.bitcoins.core.config.BitcoinNetwork
+import org.bitcoins.core.currency.{CurrencyUnit, Satoshis}
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.protocol.transaction.{
+  OutputReference,
+  Transaction,
+  TransactionOutPoint,
+  WitnessTransaction
+}
+import org.bitcoins.core.protocol.{BitcoinAddress, BlockTimeStamp}
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto._
+import scodec.bits.ByteVector
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCTxBuilder(offer: DLCOffer, accept: DLCAcceptWithoutSigs)(implicit
+    ec: ExecutionContext) {
+
+  val DLCOffer(_,
+               DLCPublicKeys(offerFundingKey: ECPublicKey,
+                             offerFinalAddress: BitcoinAddress),
+               offerTotalCollateral: Satoshis,
+               offerFundingInputs: Vector[DLCFundingInput],
+               offerChangeAddress: BitcoinAddress,
+               feeRate: SatoshisPerVirtualByte,
+               DLCTimeouts(contractMaturity: BlockTimeStamp,
+                           contractTimeout: BlockTimeStamp)) = offer
+
+  val network: BitcoinNetwork = offerFinalAddress.networkParameters match {
+    case network: BitcoinNetwork => network
+  }
+
+  val DLCAcceptWithoutSigs(acceptTotalCollateral: Satoshis,
+                           DLCPublicKeys(acceptFundingKey: ECPublicKey,
+                                         acceptFinalAddress: BitcoinAddress),
+                           acceptFundingInputs: Vector[DLCFundingInput],
+                           acceptChangeAddress: BitcoinAddress,
+                           tempContractId: Sha256Digest) = accept
+
+  val totalInput: CurrencyUnit = offerTotalCollateral + acceptTotalCollateral
+
+  // builder.offer.oracleAndContractInfo should not be used,
+  // builder.oracleAndContractInfo should be used instead in case a party
+  // is over-collateralized in which case payouts will be incorrect here.
+  private val oracleAndContractInfoBeforeAccept: OracleAndContractInfo =
+    offer.oracleAndContractInfo
+
+  val oracleAndContractInfo: OracleAndContractInfo =
+    oracleAndContractInfoBeforeAccept.updateTotalCollateral(totalInput.satoshis)
+
+  val offerTotalFunding: CurrencyUnit =
+    offerFundingInputs.map(_.output.value).sum
+
+  val acceptTotalFunding: CurrencyUnit =
+    acceptFundingInputs.map(_.output.value).sum
+
+  require(offer.tempContractId == tempContractId,
+          "Offer and accept (without sigs) must refer to same event")
+  require(acceptFinalAddress.networkParameters == network,
+          "Offer and accept (without sigs) must be on the same network")
+  require(offerChangeAddress.networkParameters == network,
+          "Offer change address must have same network as final address")
+  require(acceptChangeAddress.networkParameters == network,
+          "Accept change address must have same network as final address")
+  require(totalInput >= oracleAndContractInfo.offerContractInfo.max,
+          "Total collateral must add up to max winnings")
+  require(
+    offerTotalFunding >= offerTotalCollateral,
+    "Offer funding inputs must add up to at least offer's total collateral")
+  require(
+    acceptTotalFunding >= acceptTotalCollateral,
+    "Accept funding inputs must add up to at least accept's total collateral")
+
+  /** Returns the payouts for the signature as (toOffer, toAccept) */
+  def getPayouts(oracleSigs: Vector[SchnorrDigitalSignature]): (
+      CurrencyUnit,
+      CurrencyUnit) = {
+    oracleAndContractInfo.getPayouts(oracleSigs)
+  }
+
+  lazy val fundingTxBuilder: DLCFundingTxBuilder = {
+    DLCFundingTxBuilder(
+      offerFundingKey = offerFundingKey,
+      acceptFundingKey = acceptFundingKey,
+      feeRate = feeRate,
+      offerInput = offerTotalCollateral,
+      acceptInput = acceptTotalCollateral,
+      offerFundingInputs = offerFundingInputs,
+      acceptFundingInputs = acceptFundingInputs,
+      offerChangeSPK = offerChangeAddress.scriptPubKey,
+      acceptChangeSPK = acceptChangeAddress.scriptPubKey,
+      offerPayoutSPK = offerFinalAddress.scriptPubKey,
+      acceptPayoutSPK = acceptFinalAddress.scriptPubKey
+    )
+  }
+
+  /** Constructs the unsigned funding transaction */
+  lazy val buildFundingTx: Future[Transaction] = {
+    fundingTxBuilder.buildFundingTx()
+  }
+
+  lazy val calcContractId: Future[ByteVector] = {
+    buildFundingTx.map(_.txIdBE.bytes.xor(accept.tempContractId.bytes))
+  }
+
+  private lazy val cetBuilderF = {
+    for {
+      fundingTx <- buildFundingTx
+    } yield {
+      val fundingOutPoint = TransactionOutPoint(fundingTx.txId, UInt32.zero)
+      val fundingOutputRef =
+        OutputReference(fundingOutPoint, fundingTx.outputs.head)
+
+      DLCCETBuilder(
+        oracleAndContractInfo = oracleAndContractInfo,
+        offerFundingKey = offerFundingKey,
+        offerFinalSPK = offerFinalAddress.scriptPubKey,
+        acceptFundingKey = acceptFundingKey,
+        acceptFinalSPK = acceptFinalAddress.scriptPubKey,
+        timeouts = offer.timeouts,
+        feeRate = feeRate,
+        fundingOutputRef = fundingOutputRef
+      )
+    }
+  }
+
+  /** Constructs the unsigned Contract Execution Transaction (CET)
+    * for a given outcome hash
+    */
+  def buildCET(msg: DLCOutcomeType): Future[WitnessTransaction] = {
+    for {
+      cetBuilder <- cetBuilderF
+      cet <- cetBuilder.buildCET(msg)
+    } yield cet
+  }
+
+  /** Constructs the unsigned refund transaction */
+  lazy val buildRefundTx: Future[WitnessTransaction] = {
+    val builderF = for {
+      fundingTx <- buildFundingTx
+    } yield {
+      val fundingOutPoint = TransactionOutPoint(fundingTx.txId, UInt32.zero)
+      val fundingOutputRef =
+        OutputReference(fundingOutPoint, fundingTx.outputs.head)
+
+      DLCRefundTxBuilder(
+        offerTotalCollateral,
+        offerFundingKey,
+        offerFinalAddress.scriptPubKey,
+        acceptTotalCollateral,
+        acceptFundingKey,
+        acceptFinalAddress.scriptPubKey,
+        fundingOutputRef,
+        offer.timeouts,
+        feeRate
+      )
+    }
+
+    builderF.flatMap(_.buildRefundTx())
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/execution/DLCExecutor.scala b/dlc/src/main/scala/org/bitcoins/dlc/execution/DLCExecutor.scala
new file mode 100644
index 0000000000..698fb6e1d6
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/execution/DLCExecutor.scala
@@ -0,0 +1,100 @@
+package org.bitcoins.dlc.execution
+
+import org.bitcoins.commons.jsonmodels.dlc.{CETSignatures, FundingSignatures}
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.crypto.SchnorrDigitalSignature
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import org.bitcoins.dlc.sign.DLCTxSigner
+
+import scala.concurrent.{ExecutionContext, Future}
+
+/** Responsible for constructing SetupDLCs and DLCOutcomes */
+case class DLCExecutor(signer: DLCTxSigner)(implicit ec: ExecutionContext) {
+  val builder: DLCTxBuilder = signer.builder
+  val isInitiator: Boolean = signer.isInitiator
+
+  /** Constructs the initiator's SetupDLC given the non-initiator's
+    * CETSignatures which should arrive in a DLC accept message
+    */
+  def setupDLCOffer(cetSigs: CETSignatures): Future[SetupDLC] = {
+    require(isInitiator, "You should call setupDLCAccept")
+
+    setupDLC(cetSigs, None)
+  }
+
+  /** Constructs the non-initiator's SetupDLC given the initiator's
+    * CETSignatures and FundingSignatures which should arrive in
+    * a DLC sign message
+    */
+  def setupDLCAccept(
+      cetSigs: CETSignatures,
+      fundingSigs: FundingSignatures): Future[SetupDLC] = {
+    require(!isInitiator, "You should call setupDLCOffer")
+
+    setupDLC(cetSigs, Some(fundingSigs))
+  }
+
+  /** Constructs a SetupDLC given the necessary signature information
+    * from the counter-party.
+    */
+  def setupDLC(
+      cetSigs: CETSignatures,
+      fundingSigsOpt: Option[FundingSignatures]): Future[SetupDLC] = {
+    if (!isInitiator) {
+      require(fundingSigsOpt.isDefined,
+              "Accepting party must provide remote funding signatures")
+    }
+
+    val CETSignatures(outcomeSigs, refundSig) = cetSigs
+    val cetInfoFs = outcomeSigs.map {
+      case (msg, remoteAdaptorSig) =>
+        builder.buildCET(msg).map { cet =>
+          msg -> CETInfo(cet, remoteAdaptorSig)
+        }
+    }
+
+    for {
+      fundingTx <- {
+        fundingSigsOpt match {
+          case Some(fundingSigs) => signer.signFundingTx(fundingSigs)
+          case None              => builder.buildFundingTx
+        }
+      }
+      cetInfos <- Future.sequence(cetInfoFs)
+      refundTx <- signer.signRefundTx(refundSig)
+    } yield {
+      SetupDLC(fundingTx, cetInfos.toMap, refundTx)
+    }
+  }
+
+  /** Return's this party's payout for a given oracle signature */
+  def getPayout(sigs: Vector[SchnorrDigitalSignature]): CurrencyUnit = {
+    signer.getPayout(sigs)
+  }
+
+  def executeDLC(
+      dlcSetup: SetupDLC,
+      oracleSigs: Vector[SchnorrDigitalSignature]): Future[
+    ExecutedDLCOutcome] = {
+    val SetupDLC(fundingTx, cetInfos, _) = dlcSetup
+
+    val msgOpt = builder.oracleAndContractInfo.findOutcome(oracleSigs)
+    val (msg, remoteAdaptorSig) = msgOpt match {
+      case Some(msg) =>
+        val cetInfo = cetInfos(msg)
+        (msg, cetInfo.remoteSignature)
+      case None =>
+        throw new IllegalArgumentException(
+          s"Signature does not correspond to any possible outcome! ${oracleSigs.map(_.hex).mkString(", ")}")
+    }
+
+    signer.signCET(msg, remoteAdaptorSig, oracleSigs).map { cet =>
+      ExecutedDLCOutcome(fundingTx, cet, msg)
+    }
+  }
+
+  def executeRefundDLC(dlcSetup: SetupDLC): RefundDLCOutcome = {
+    val SetupDLC(fundingTx, _, refundTx) = dlcSetup
+    RefundDLCOutcome(fundingTx, refundTx)
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/execution/DLCOutcome.scala b/dlc/src/main/scala/org/bitcoins/dlc/execution/DLCOutcome.scala
new file mode 100644
index 0000000000..31737bd9b2
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/execution/DLCOutcome.scala
@@ -0,0 +1,19 @@
+package org.bitcoins.dlc.execution
+
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.protocol.transaction.Transaction
+
+sealed trait DLCOutcome {
+  def fundingTx: Transaction
+}
+
+case class ExecutedDLCOutcome(
+    override val fundingTx: Transaction,
+    cet: Transaction,
+    outcome: DLCOutcomeType)
+    extends DLCOutcome
+
+case class RefundDLCOutcome(
+    override val fundingTx: Transaction,
+    refundTx: Transaction)
+    extends DLCOutcome
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/execution/SetupDLC.scala b/dlc/src/main/scala/org/bitcoins/dlc/execution/SetupDLC.scala
new file mode 100644
index 0000000000..39cb4f77e1
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/execution/SetupDLC.scala
@@ -0,0 +1,34 @@
+package org.bitcoins.dlc.execution
+
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.protocol.transaction.{Transaction, TransactionOutPoint}
+import org.bitcoins.crypto.ECAdaptorSignature
+
+case class SetupDLC(
+    fundingTx: Transaction,
+    cets: Map[DLCOutcomeType, CETInfo],
+    refundTx: Transaction) {
+  cets.foreach {
+    case (msg, cetInfo) =>
+      require(
+        cetInfo.tx.inputs.size == 1,
+        s"CETs should only spend the funding input, local CET for $msg has ${cetInfo.tx.inputs.size} inputs")
+      require(
+        cetInfo.tx.inputs.head.previousOutput == TransactionOutPoint(
+          fundingTx.txId,
+          UInt32.zero),
+        s"CET is not spending the funding input, ${cetInfo.tx.inputs.head}"
+      )
+  }
+  require(
+    refundTx.inputs.size == 1,
+    s"RefundTx should only spend the funding input, refundTx has ${refundTx.inputs.size} inputs")
+  require(
+    refundTx.inputs.head.previousOutput == TransactionOutPoint(fundingTx.txId,
+                                                               UInt32.zero),
+    s"RefundTx is not spending the funding input, ${refundTx.inputs.head}"
+  )
+}
+
+case class CETInfo(tx: Transaction, remoteSignature: ECAdaptorSignature)
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/sign/DLCTxSigner.scala b/dlc/src/main/scala/org/bitcoins/dlc/sign/DLCTxSigner.scala
new file mode 100644
index 0000000000..1f7cc344c0
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/sign/DLCTxSigner.scala
@@ -0,0 +1,307 @@
+package org.bitcoins.dlc.sign
+
+import org.bitcoins.commons.jsonmodels.dlc.{
+  CETSignatures,
+  DLCFundingInput,
+  FundingSignatures
+}
+import org.bitcoins.core.config.BitcoinNetwork
+import org.bitcoins.core.crypto.TransactionSignatureSerializer
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.script._
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.protocol.{Bech32Address, BitcoinAddress}
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.core.psbt.PSBT
+import org.bitcoins.core.script.crypto.HashType
+import org.bitcoins.core.wallet.signer.BitcoinSigner
+import org.bitcoins.core.wallet.utxo._
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.builder.DLCTxBuilder
+
+import scala.concurrent.{ExecutionContext, Future}
+import scala.util.Success
+
+/** Responsible for constructing all DLC signatures
+  * and signed transactions
+  */
+case class DLCTxSigner(
+    builder: DLCTxBuilder,
+    isInitiator: Boolean,
+    fundingKey: ECPrivateKey,
+    finalAddress: BitcoinAddress,
+    fundingUtxos: Vector[ScriptSignatureParams[InputInfo]])(implicit
+    ec: ExecutionContext) {
+
+  private val offer = builder.offer
+  private val accept = builder.accept
+
+  private val remoteFundingPubKey = if (isInitiator) {
+    accept.pubKeys.fundingKey
+  } else {
+    offer.pubKeys.fundingKey
+  }
+
+  private val fundingSPK: MultiSignatureScriptPubKey =
+    builder.fundingTxBuilder.fundingMultiSig
+
+  if (isInitiator) {
+    require(fundingKey.publicKey == offer.pubKeys.fundingKey &&
+              finalAddress == offer.pubKeys.payoutAddress,
+            "Given keys do not match public key and address in offer")
+    require(fundingUtxos.map(
+              DLCFundingInput.fromInputSigningInfo(_)) == offer.fundingInputs,
+            "Funding ScriptSignatureParams did not match offer funding inputs")
+  } else {
+    require(
+      fundingKey.publicKey == accept.pubKeys.fundingKey &&
+        finalAddress == accept.pubKeys.payoutAddress,
+      "Given keys do not match public key and address in accept"
+    )
+    require(fundingUtxos.map(
+              DLCFundingInput.fromInputSigningInfo(_)) == accept.fundingInputs,
+            "Funding ScriptSignatureParams did not match accept funding inputs")
+  }
+
+  /** Return's this party's payout for a given oracle signature */
+  def getPayout(sigs: Vector[SchnorrDigitalSignature]): CurrencyUnit = {
+    val (offerPayout, acceptPayout) = builder.getPayouts(sigs)
+    if (isInitiator) {
+      offerPayout
+    } else {
+      acceptPayout
+    }
+  }
+
+  /** Creates this party's FundingSignatures */
+  def createFundingTxSigs(): Future[FundingSignatures] = {
+    val sigFs =
+      Vector.newBuilder[Future[(TransactionOutPoint, ScriptWitnessV0)]]
+
+    for {
+      fundingTx <- builder.buildFundingTx
+
+      _ = {
+        fundingUtxos.foreach { utxo =>
+          val sigComponentF =
+            BitcoinSigner.sign(utxo, fundingTx, isDummySignature = false)
+          val witnessF = sigComponentF.flatMap { sigComponent =>
+            sigComponent.transaction match {
+              case wtx: WitnessTransaction =>
+                val witness = wtx.witness(sigComponent.inputIndex.toInt)
+                if (witness == EmptyScriptWitness) {
+                  Future.failed(
+                    new RuntimeException(
+                      s"Funding Inputs must be SegWit: $utxo"))
+                } else {
+                  Future.successful(witness)
+                }
+              case _: NonWitnessTransaction =>
+                Future.failed(
+                  new RuntimeException(s"Funding Inputs must be SegWit: $utxo"))
+            }
+          }
+
+          sigFs += witnessF.flatMap {
+            case witness: ScriptWitnessV0 =>
+              Future.successful((utxo.outPoint, witness))
+            case witness: ScriptWitness =>
+              Future.failed(
+                new RuntimeException(s"Unrecognized script witness: $witness"))
+          }
+        }
+      }
+
+      sigs <- Future.sequence(sigFs.result())
+    } yield {
+      val sigsMap = sigs.toMap
+
+      val fundingInputs = if (isInitiator) {
+        offer.fundingInputs
+      } else {
+        accept.fundingInputs
+      }
+
+      val sigsVec = fundingInputs.map { input =>
+        input.outPoint -> sigsMap(input.outPoint)
+      }
+
+      FundingSignatures(sigsVec)
+    }
+  }
+
+  /** Constructs the signed DLC funding transaction given remote FundingSignatures */
+  def signFundingTx(remoteSigs: FundingSignatures): Future[Transaction] = {
+    val fundingInputs = offer.fundingInputs ++ accept.fundingInputs
+
+    val psbtF = for {
+      localSigs <- createFundingTxSigs()
+      allSigs = localSigs.merge(remoteSigs)
+      fundingTx <- builder.buildFundingTx
+    } yield {
+      fundingInputs.zipWithIndex.foldLeft(
+        PSBT.fromUnsignedTxWithP2SHScript(fundingTx)) {
+        case (psbt, (fundingInput, index)) =>
+          val witness = allSigs(fundingInput.outPoint)
+
+          psbt
+            .addUTXOToInput(fundingInput.prevTx, index)
+            .addFinalizedScriptWitnessToInput(fundingInput.scriptSignature,
+                                              witness,
+                                              index)
+      }
+    }
+
+    psbtF.flatMap { psbt =>
+      val finalizedT = if (psbt.isFinalized) {
+        Success(psbt)
+      } else {
+        psbt.finalizePSBT
+      }
+
+      val txT = finalizedT.flatMap(_.extractTransactionAndValidate)
+      Future.fromTry(txT)
+    }
+  }
+
+  private def findSigInPSBT(
+      psbt: PSBT,
+      pubKey: ECPublicKey): Future[PartialSignature] = {
+    val sigOpt = psbt.inputMaps.head.partialSignatures
+      .find(_.pubKey == pubKey)
+
+    sigOpt match {
+      case None =>
+        Future.failed(new RuntimeException("No signature found after signing"))
+      case Some(partialSig) => Future.successful(partialSig)
+    }
+  }
+
+  /** Signs remote's Contract Execution Transaction (CET) for a given outcome hash */
+  def createRemoteCETSig(msg: DLCOutcomeType): Future[ECAdaptorSignature] = {
+    val adaptorPoint = builder.oracleAndContractInfo.sigPointForOutcome(msg)
+    val hashType = HashType.sigHashAll
+    for {
+      fundingTx <- builder.buildFundingTx
+      fundingOutPoint = TransactionOutPoint(fundingTx.txId, UInt32.zero)
+      utx <- builder.buildCET(msg)
+      signingInfo = ECSignatureParams(
+        P2WSHV0InputInfo(outPoint = fundingOutPoint,
+                         amount = fundingTx.outputs.head.value,
+                         scriptWitness = P2WSHWitnessV0(fundingSPK),
+                         conditionalPath = ConditionalPath.NoCondition),
+        fundingTx,
+        fundingKey,
+        hashType
+      )
+      utxWithData = TxUtil.addWitnessData(utx, signingInfo)
+      hashToSign = TransactionSignatureSerializer.hashForSignature(utxWithData,
+                                                                   signingInfo,
+                                                                   hashType)
+    } yield {
+      fundingKey.adaptorSign(adaptorPoint, hashToSign.bytes)
+    }
+  }
+
+  def signCET(
+      msg: DLCOutcomeType,
+      remoteAdaptorSig: ECAdaptorSignature,
+      oracleSigs: Vector[SchnorrDigitalSignature]): Future[Transaction] = {
+    val oracleSigSum = oracleSigs.map(_.sig).reduce(_.add(_)).toPrivateKey
+    val remoteSig =
+      oracleSigSum
+        .completeAdaptorSignature(remoteAdaptorSig, HashType.sigHashAll.byte)
+
+    val remotePartialSig = PartialSignature(remoteFundingPubKey, remoteSig)
+    for {
+      fundingTx <- builder.buildFundingTx
+      utx <- builder.buildCET(msg)
+
+      psbt <-
+        PSBT
+          .fromUnsignedTx(utx)
+          .addUTXOToInput(fundingTx, index = 0)
+          .addScriptWitnessToInput(P2WSHWitnessV0(fundingSPK), index = 0)
+          .addSignature(remotePartialSig, inputIndex = 0)
+          .sign(inputIndex = 0, fundingKey)
+
+      cetT = psbt.finalizePSBT.flatMap(_.extractTransactionAndValidate)
+      cet <- Future.fromTry(cetT)
+    } yield {
+      cet
+    }
+  }
+
+  /** Creates a PSBT of the refund transaction which contain's this
+    * party's signature
+    */
+  def createPartiallySignedRefundTx(): Future[PSBT] = {
+    for {
+      fundingTx <- builder.buildFundingTx
+      utx <- builder.buildRefundTx
+      psbt <-
+        PSBT
+          .fromUnsignedTx(utx)
+          .addUTXOToInput(fundingTx, index = 0)
+          .addScriptWitnessToInput(P2WSHWitnessV0(fundingSPK), index = 0)
+          .sign(inputIndex = 0, fundingKey)
+    } yield {
+      psbt
+    }
+  }
+
+  /** Creates this party's signature of the refund transaction */
+  def createRefundSig(): Future[PartialSignature] = {
+    for {
+      psbt <- createPartiallySignedRefundTx()
+      signature <- findSigInPSBT(psbt, fundingKey.publicKey)
+    } yield {
+      signature
+    }
+  }
+
+  /** Constructs the signed refund transaction given remote's signature */
+  def signRefundTx(remoteSig: PartialSignature): Future[Transaction] = {
+    for {
+      unsignedPSBT <- createPartiallySignedRefundTx()
+      psbt = unsignedPSBT.addSignature(remoteSig, inputIndex = 0)
+
+      refundTxT = psbt.finalizePSBT.flatMap(_.extractTransactionAndValidate)
+      refundTx <- Future.fromTry(refundTxT)
+    } yield {
+      refundTx
+    }
+  }
+
+  /** Creates all of this party's CETSignatures */
+  def createCETSigs(): Future[CETSignatures] = {
+    val cetSigFs = builder.oracleAndContractInfo.allOutcomes.map { msg =>
+      // Need to wrap in another future so they are all started at once
+      // and do not block each other
+      Future(createRemoteCETSig(msg).map(msg -> _)).flatten
+    }
+
+    for {
+      cetSigs <- Future.sequence(cetSigFs)
+      refundSig <- createRefundSig()
+    } yield CETSignatures(cetSigs, refundSig)
+  }
+}
+
+object DLCTxSigner {
+
+  def apply(
+      builder: DLCTxBuilder,
+      isInitiator: Boolean,
+      fundingKey: ECPrivateKey,
+      payoutPrivKey: ECPrivateKey,
+      network: BitcoinNetwork,
+      fundingUtxos: Vector[ScriptSignatureParams[InputInfo]])(implicit
+      ec: ExecutionContext): DLCTxSigner = {
+    val payoutAddr =
+      Bech32Address(P2WPKHWitnessSPKV0(payoutPrivKey.publicKey), network)
+    DLCTxSigner(builder, isInitiator, fundingKey, payoutAddr, fundingUtxos)
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCFeeTestVector.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCFeeTestVector.scala
new file mode 100644
index 0000000000..7310ba9432
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCFeeTestVector.scala
@@ -0,0 +1,150 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.core.currency.{CurrencyUnit, Satoshis}
+import org.bitcoins.core.protocol.script._
+import org.bitcoins.core.wallet.builder.{
+  DualFundingInput,
+  DualFundingTxFinalizer
+}
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto.ECPublicKey
+import play.api.libs.json._
+import scodec.bits.ByteVector
+
+case class DLCFeeTestVector(
+    inputs: DLCFeeTestVectorInput,
+    offerFundingFee: Satoshis,
+    offerClosingFee: Satoshis,
+    acceptFundingFee: Satoshis,
+    acceptClosingFee: Satoshis)
+    extends TestVector {
+
+  override def toJson: JsValue = {
+    Json.toJson(this)(DLCFeeTestVector.dlcFeeTestVectorFormat)
+  }
+}
+
+case class FundingFeeInfo(redeemScriptLen: Int, maxWitnessLen: Int) {
+
+  lazy val mockDualFundingInput: DualFundingInput = {
+    val scriptSig = if (redeemScriptLen == 0) {
+      EmptyScriptSignature
+    } else {
+      val wspk = if (redeemScriptLen == 22) {
+        P2WPKHWitnessSPKV0(ECPublicKey.freshPublicKey)
+      } else {
+        P2WSHWitnessSPKV0(EmptyScriptPubKey)
+      }
+      P2SHScriptSignature(wspk)
+    }
+
+    DualFundingInput(scriptSig, maxWitnessLen)
+  }
+}
+
+case class DLCFeeTestVectorInput(
+    offerInputs: Vector[FundingFeeInfo],
+    offerPayoutSPKLen: Int,
+    offerChangeSPKLen: Int,
+    acceptInputs: Vector[FundingFeeInfo],
+    acceptPayoutSPKLen: Int,
+    acceptChangeSPKLen: Int,
+    feeRate: SatoshisPerVirtualByte) {
+
+  lazy val mockDualFundingTxFinalizer: DualFundingTxFinalizer = {
+    def mockSPK(len: Int): ScriptPubKey = {
+      ScriptPubKey.fromAsmBytes(ByteVector.fill(len)(0x00.toByte))
+    }
+
+    DualFundingTxFinalizer(
+      offerInputs.map(_.mockDualFundingInput),
+      mockSPK(offerPayoutSPKLen),
+      mockSPK(offerChangeSPKLen),
+      acceptInputs.map(_.mockDualFundingInput),
+      mockSPK(acceptPayoutSPKLen),
+      mockSPK(acceptChangeSPKLen),
+      feeRate,
+      EmptyScriptPubKey
+    )
+  }
+
+  lazy val offerFundingFee: CurrencyUnit =
+    mockDualFundingTxFinalizer.offerFundingFee
+
+  lazy val offerClosingFee: CurrencyUnit =
+    mockDualFundingTxFinalizer.offerFutureFee
+
+  lazy val acceptFundingFee: CurrencyUnit =
+    mockDualFundingTxFinalizer.acceptFundingFee
+
+  lazy val acceptClosingFee: CurrencyUnit =
+    mockDualFundingTxFinalizer.acceptFutureFee
+}
+
+object DLCFeeTestVectorInput {
+
+  def fromJson(json: JsValue): JsResult[DLCFeeTestVectorInput] = {
+    json.validate(DLCFeeTestVector.dlcFeeTestVectorInputFormat)
+  }
+}
+
+object DLCFeeTestVector extends TestVectorParser[DLCFeeTestVector] {
+
+  def apply(inputs: DLCFeeTestVectorInput): DLCFeeTestVector = {
+    DLCFeeTestVector(
+      inputs,
+      inputs.offerFundingFee.satoshis,
+      inputs.offerClosingFee.satoshis,
+      inputs.acceptFundingFee.satoshis,
+      inputs.acceptClosingFee.satoshis
+    )
+  }
+
+  def apply(
+      offerInputs: Vector[FundingFeeInfo],
+      offerPayoutSPKLen: Int,
+      offerChangeSPKLen: Int,
+      acceptInputs: Vector[FundingFeeInfo],
+      acceptPayoutSPKLen: Int,
+      acceptChangeSPKLen: Int,
+      feeRate: SatoshisPerVirtualByte): DLCFeeTestVector = {
+    DLCFeeTestVector(
+      DLCFeeTestVectorInput(
+        offerInputs,
+        offerPayoutSPKLen,
+        offerChangeSPKLen,
+        acceptInputs,
+        acceptPayoutSPKLen,
+        acceptChangeSPKLen,
+        feeRate
+      )
+    )
+  }
+
+  implicit val fundingFeeInfoFormat: Format[FundingFeeInfo] =
+    Json.format[FundingFeeInfo]
+
+  implicit val satsPerVBFormat: Format[SatoshisPerVirtualByte] =
+    Format[SatoshisPerVirtualByte](
+      {
+        _.validate[Long].map(Satoshis.apply).map(SatoshisPerVirtualByte.apply)
+      },
+      { satsPerVB => JsNumber(satsPerVB.toLong) }
+    )
+
+  implicit val dlcFeeTestVectorInputFormat: Format[DLCFeeTestVectorInput] =
+    Json.format[DLCFeeTestVectorInput]
+
+  implicit val satoshisFormat: Format[Satoshis] =
+    Format[Satoshis](
+      { _.validate[Long].map(Satoshis.apply) },
+      { sats => JsNumber(sats.toLong) }
+    )
+
+  implicit val dlcFeeTestVectorFormat: Format[DLCFeeTestVector] =
+    Json.format[DLCFeeTestVector]
+
+  override def fromJson(json: JsValue): JsResult[DLCFeeTestVector] = {
+    json.validate[DLCFeeTestVector]
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCFeeTestVectorGen.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCFeeTestVectorGen.scala
new file mode 100644
index 0000000000..1328ee6e27
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCFeeTestVectorGen.scala
@@ -0,0 +1,94 @@
+package org.bitcoins.dlc.testgen
+
+import java.io.File
+
+import org.bitcoins.core.currency.Satoshis
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import play.api.libs.json.{JsResult, JsValue}
+
+import scala.concurrent.Future
+
+object DLCFeeTestVectorGen
+    extends TestVectorGen[DLCFeeTestVector, DLCFeeTestVectorInput] {
+
+  override val defaultTestFile: File = new File(
+    "dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test.json")
+
+  override val testVectorParser: DLCFeeTestVector.type =
+    DLCFeeTestVector
+
+  override def inputFromJson: JsValue => JsResult[DLCFeeTestVectorInput] =
+    DLCFeeTestVectorInput.fromJson
+
+  override val inputStr: String = "inputs"
+
+  override def generateFromInput: DLCFeeTestVectorInput => Future[
+    DLCFeeTestVector] = { input =>
+    Future.successful(DLCFeeTestVector(input))
+  }
+
+  override def generateTestVectors(): Future[Vector[DLCFeeTestVector]] = {
+    val redeemScriptLens = Vector(0, 22, 34)
+    val maxWitnessLens = Vector(108, 133, 218)
+    val feeFundingInfo1 = FundingFeeInfo(0, 108)
+    val feeFundingInfo2 = FundingFeeInfo(22, 108)
+    val feeFundingInfo3 = FundingFeeInfo(34, 218)
+    val oneInput = Vector(feeFundingInfo1)
+    val twoInputs = Vector(feeFundingInfo2, feeFundingInfo3)
+    val feeFundingInfos = redeemScriptLens.flatMap { redeemScriptLen =>
+      maxWitnessLens.flatMap { maxWitnessLen =>
+        if (
+          redeemScriptLen == 22 && (maxWitnessLen != 107 || maxWitnessLen != 108)
+        ) {
+          None
+        } else {
+          Some(FundingFeeInfo(redeemScriptLen, maxWitnessLen))
+        }
+      }
+    }
+
+    val payoutSPKLens = Vector(22, 25, 34, 35, 71, 173)
+    val changeSPKLens = Vector(22, 34)
+    val feeRates = Vector(1L, 5L, 10L)
+      .map(Satoshis.apply)
+      .map(SatoshisPerVirtualByte.apply)
+
+    def allTests(
+        offerInputs: Vector[FundingFeeInfo],
+        acceptInputs: Vector[FundingFeeInfo]): Vector[DLCFeeTestVector] = {
+      for {
+        offerPayoutSPKLen <- payoutSPKLens
+        offerChangeSPKLen <- changeSPKLens
+        acceptPayoutSPKLen <- payoutSPKLens
+        acceptChangeSPKLen <- changeSPKLens
+        feeRate <- feeRates
+      } yield {
+        DLCFeeTestVector(
+          offerInputs,
+          offerPayoutSPKLen,
+          offerChangeSPKLen,
+          acceptInputs,
+          acceptPayoutSPKLen,
+          acceptChangeSPKLen,
+          feeRate
+        )
+      }
+    }
+
+    def someTests(
+        offerInputs: Vector[FundingFeeInfo],
+        acceptInputs: Vector[FundingFeeInfo]): Vector[DLCFeeTestVector] = {
+      allTests(offerInputs, acceptInputs)
+        .sortBy(_ => scala.util.Random.nextDouble())
+        .take(10)
+    }
+
+    val tests = allTests(oneInput, oneInput) ++
+      someTests(twoInputs, twoInputs) ++
+      someTests(oneInput, twoInputs) ++
+      someTests(twoInputs, oneInput) ++
+      someTests(feeFundingInfos, feeFundingInfos)
+
+    Future.successful(tests)
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCParsingTestVector.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCParsingTestVector.scala
new file mode 100644
index 0000000000..74501623a1
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCParsingTestVector.scala
@@ -0,0 +1,442 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.core.number.{UInt16, UInt64}
+import org.bitcoins.core.protocol.BigSizeUInt
+import org.bitcoins.core.protocol.script.EmptyScriptPubKey
+import org.bitcoins.core.protocol.tlv._
+import org.bitcoins.crypto.{CryptoUtil, NetworkElement}
+import org.bitcoins.dlc.testgen.ByteVectorWrapper._
+import play.api.libs.json.{
+  JsArray,
+  JsError,
+  JsObject,
+  JsResult,
+  JsString,
+  JsSuccess,
+  JsValue
+}
+import scodec.bits.ByteVector
+
+sealed trait DLCParsingTestVector extends TestVector {
+  def input: NetworkElement
+  def tpeName: String
+  def fields: Vector[(String, ByteVectorWrapper)]
+
+  override def toJson: JsValue = {
+    val jsonFields = fields.map {
+      case (name, byteWrapper) =>
+        name -> byteWrapper.toJson
+    }
+
+    JsObject(
+      Map(
+        "tpeName" -> JsString(tpeName),
+        "input" -> JsString(input.hex),
+        "fields" -> JsObject(jsonFields)
+      ))
+  }
+}
+
+sealed trait ByteVectorWrapper {
+  def toJson: JsValue
+}
+
+object ByteVectorWrapper {
+
+  implicit class Element(val bytes: ByteVector) extends ByteVectorWrapper {
+
+    override def equals(obj: Any): Boolean = {
+      obj match {
+        case elem: Element => elem.bytes == bytes
+        case _             => false
+      }
+    }
+
+    override def toString: String = {
+      s"Element(${bytes.length} bytes, 0x${bytes.toHex})"
+    }
+
+    override def toJson: JsValue = {
+      JsString(bytes.toHex)
+    }
+  }
+
+  object Element {
+
+    def apply(element: NetworkElement): Element = {
+      element.bytes
+    }
+  }
+
+  case class MultiElement(elements: Vector[ByteVectorWrapper])
+      extends ByteVectorWrapper {
+
+    override def toString: String = {
+      s"MultiElement(${elements.mkString(",")})"
+    }
+
+    override def toJson: JsValue = {
+      JsArray(elements.map(_.toJson))
+    }
+  }
+
+  object MultiElement {
+
+    def apply(elements: ByteVectorWrapper*): MultiElement = {
+      new MultiElement(elements.toVector)
+    }
+  }
+
+  case class NamedMultiElement(elements: Vector[(String, ByteVectorWrapper)])
+      extends ByteVectorWrapper {
+
+    override def toString: String = {
+      s"NamedMultiElement(${elements
+        .map { case (name, bytes) => s"$name -> $bytes" }
+        .mkString(",")})"
+    }
+
+    override def toJson: JsValue = {
+      JsObject(elements.map { case (name, element) => name -> element.toJson })
+    }
+  }
+
+  object NamedMultiElement {
+
+    def apply(elements: (String, ByteVectorWrapper)*): NamedMultiElement = {
+      new NamedMultiElement(elements.toVector)
+    }
+  }
+
+  def fromJson(json: JsValue): JsResult[ByteVectorWrapper] = {
+    json.validate[String] match {
+      case JsSuccess(hex, _) => JsSuccess(ByteVector.fromValidHex(hex))
+      case JsError(_) =>
+        json.validate[Vector[JsValue]] match {
+          case JsSuccess(vec, _) =>
+            val nestedResult =
+              DLCParsingTestVector.flattenJsResult(vec.map(fromJson))
+            nestedResult.map(MultiElement(_))
+          case JsError(_) =>
+            json.validate[Map[String, JsValue]] match {
+              case JsSuccess(obj, _) =>
+                val jsResults = obj.map {
+                  case (name, nestedJson) => fromJson(nestedJson).map(name -> _)
+                }.toVector
+                val nestedResult =
+                  DLCParsingTestVector.flattenJsResult(jsResults)
+                nestedResult.map(NamedMultiElement(_))
+              case JsError(_) => JsError("Couldn't parse field bytes")
+            }
+        }
+    }
+  }
+}
+
+case class DLCTLVTestVector(
+    input: TLV,
+    tpeName: String,
+    fields: Vector[(String, ByteVectorWrapper)])
+    extends DLCParsingTestVector
+
+case class DLCMessageTestVector(
+    input: LnMessage[TLV],
+    tpeName: String,
+    fields: Vector[(String, ByteVectorWrapper)])
+    extends DLCParsingTestVector
+
+object DLCParsingTestVector extends TestVectorParser[DLCParsingTestVector] {
+
+  def apply(tlv: TLV): DLCParsingTestVector = {
+    tlv match {
+      case ContractInfoV0TLV(outcomes) =>
+        val fields = Vector(
+          "tpe" -> Element(ContractInfoV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "outcomes" -> MultiElement(outcomes.toVector.map {
+            case (outcome, amt) =>
+              NamedMultiElement("outcome" -> CryptoUtil.sha256(outcome).bytes,
+                                "localPayout" -> amt.toUInt64.bytes)
+          })
+        )
+        DLCTLVTestVector(tlv, "contract_info_v0", fields)
+      case ContractInfoV1TLV(base, numDigits, totalCollateral, points) =>
+        val fields = Vector(
+          "tpe" -> Element(ContractInfoV1TLV.tpe),
+          "length" -> Element(tlv.length),
+          "base" -> Element(BigSizeUInt(base)),
+          "numDigits" -> Element(UInt16(numDigits)),
+          "totalCollateral" -> Element(UInt64(totalCollateral.toLong)),
+          "numPoints" -> Element(BigSizeUInt(points.length)),
+          "points" -> MultiElement(points.map { point =>
+            NamedMultiElement(
+              "isEndpoint" -> Element(ByteVector(point.leadingByte)),
+              "outcome" -> Element(BigSizeUInt(point.outcome)),
+              "value" -> Element(UInt64(point.value.toLong))
+            )
+          })
+        )
+        DLCTLVTestVector(tlv, "contract_info_v1", fields)
+      case OracleInfoV0TLV(pubKey, rValue) =>
+        val fields = Vector(
+          "tpe" -> Element(OracleInfoV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "pubKey" -> Element(pubKey),
+          "rValue" -> Element(rValue)
+        )
+        DLCTLVTestVector(tlv, "oracle_info_v0", fields)
+      case OracleInfoV1TLV(pubKey, nonces) =>
+        val fields = Vector(
+          "tpe" -> Element(OracleInfoV1TLV.tpe),
+          "length" -> Element(tlv.length),
+          "pubKey" -> Element(pubKey),
+          "nonces" -> MultiElement(nonces.map(Element(_)))
+        )
+        DLCTLVTestVector(tlv, "oracle_info_v1", fields)
+      case FundingInputV0TLV(prevTx,
+                             prevTxVout,
+                             sequence,
+                             maxWitnessLen,
+                             redeemScriptOpt) =>
+        val redeemScript =
+          redeemScriptOpt.getOrElse(EmptyScriptPubKey)
+
+        val fields = Vector(
+          "tpe" -> Element(FundingInputV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "prevTxLen" -> Element(UInt16(prevTx.byteSize)),
+          "prevTx" -> Element(prevTx),
+          "prevTxVout" -> Element(prevTxVout),
+          "sequence" -> Element(sequence),
+          "maxWitnessLen" -> Element(maxWitnessLen),
+          "redeemScriptLen" -> Element(UInt16(redeemScript.asmBytes.length)),
+          "redeemScript" -> Element(redeemScript.asmBytes)
+        )
+        DLCTLVTestVector(tlv, "funding_input_v0", fields)
+      case CETSignaturesV0TLV(sigs) =>
+        val fields = Vector(
+          "tpe" -> Element(CETSignaturesV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "sigs" -> MultiElement(
+            sigs.map(sig =>
+              NamedMultiElement("encryptedSig" -> sig.adaptedSig,
+                                "dleqProof" -> sig.dleqProof)))
+        )
+        DLCTLVTestVector(tlv, "cet_adaptor_signatures_v0", fields)
+      case FundingSignaturesV0TLV(witnesses) =>
+        val fields = Vector(
+          "tpe" -> Element(FundingSignaturesV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "numWitnesses" -> Element(UInt16(witnesses.length)),
+          "witnesses" -> MultiElement(witnesses.map { witness =>
+            NamedMultiElement(
+              "stackLen" -> Element(UInt16(witness.stack.length)),
+              "stack" -> MultiElement(witness.stack.toVector.reverse.map {
+                stackElem =>
+                  NamedMultiElement(
+                    "stackElementLen" -> Element(UInt16(stackElem.length)),
+                    "stackElement" -> stackElem)
+              })
+            )
+          })
+        )
+        DLCTLVTestVector(tlv, "funding_signatures_v0", fields)
+      case DLCOfferTLV(contractFlags,
+                       chainHash,
+                       contractInfo,
+                       oracleInfo,
+                       fundingPubKey,
+                       payoutSPK,
+                       totalCollateralSatoshis,
+                       fundingInputs,
+                       changeSPK,
+                       feeRate,
+                       contractMaturityBound,
+                       contractTimeout) =>
+        val fields = Vector(
+          "tpe" -> Element(UInt16(DLCOfferTLV.tpe.toInt)),
+          "contractFlags" -> Element(ByteVector(contractFlags)),
+          "chainHash" -> Element(chainHash),
+          "contractInfo" -> Element(contractInfo),
+          "oracleInfo" -> Element(oracleInfo),
+          "fundingPubKey" -> Element(fundingPubKey),
+          "payoutSPKLen" -> Element(UInt16(payoutSPK.asmBytes.length)),
+          "payoutSPK" -> Element(payoutSPK.asmBytes),
+          "totalCollateralSatoshis" -> Element(
+            totalCollateralSatoshis.toUInt64),
+          "fundingInputsLen" -> Element(UInt16(fundingInputs.length)),
+          "fundingInputs" -> new MultiElement(
+            fundingInputs.map(input => Element(input.bytes))),
+          "changeSPKLen" -> Element(UInt16(changeSPK.asmBytes.length)),
+          "changeSPK" -> Element(changeSPK.asmBytes),
+          "feeRate" -> Element(feeRate.currencyUnit.satoshis.toUInt64),
+          "contractMaturityBound" -> Element(contractMaturityBound.toUInt32),
+          "contractTimeout" -> Element(contractTimeout.toUInt32)
+        )
+        DLCMessageTestVector(LnMessage(tlv), "offer_dlc_v0", fields)
+      case DLCAcceptTLV(tempContractId,
+                        totalCollateralSatoshis,
+                        fundingPubKey,
+                        payoutSPK,
+                        fundingInputs,
+                        changeSPK,
+                        cetSignatures,
+                        refundSignature) =>
+        val fields = Vector(
+          "tpe" -> Element(UInt16(DLCAcceptTLV.tpe.toInt)),
+          "tempContractId" -> Element(tempContractId),
+          "totalCollateralSatoshis" -> Element(
+            totalCollateralSatoshis.toUInt64),
+          "fundingPubKey" -> Element(fundingPubKey),
+          "payoutSPKLen" -> Element(UInt16(payoutSPK.asmBytes.length)),
+          "payoutSPK" -> Element(payoutSPK.asmBytes),
+          "fundingInputsLen" -> Element(UInt16(fundingInputs.length)),
+          "fundingInputs" -> new MultiElement(
+            fundingInputs.map(input => Element(input.bytes))),
+          "changeSPKLen" -> Element(UInt16(changeSPK.asmBytes.length)),
+          "changeSPK" -> Element(changeSPK.asmBytes),
+          "cetSignatures" -> Element(cetSignatures),
+          "refundSignature" -> Element(refundSignature.toRawRS)
+        )
+        DLCMessageTestVector(LnMessage(tlv), "accept_dlc_v0", fields)
+      case DLCSignTLV(contractId,
+                      cetSignatures,
+                      refundSignature,
+                      fundingSignatures) =>
+        val fields = Vector(
+          "tpe" -> Element(UInt16(DLCSignTLV.tpe.toInt)),
+          "contractId" -> Element(contractId),
+          "cetSignatures" -> Element(cetSignatures),
+          "refundSignature" -> Element(refundSignature.toRawRS),
+          "fundingSignatures" -> Element(fundingSignatures)
+        )
+        DLCMessageTestVector(LnMessage(tlv), "sign_dlc_v0", fields)
+      case EnumEventDescriptorV0TLV(outcomes) =>
+        val fields = Vector(
+          "tpe" -> Element(EnumEventDescriptorV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "numOutcomes" -> Element(UInt16(outcomes.size)),
+          "outcomes" -> MultiElement(outcomes.map { outcome =>
+            val outcomeBytes = CryptoUtil.serializeForHash(outcome)
+            NamedMultiElement(
+              "outcomeLen" -> Element(UInt16(outcomeBytes.length)),
+              "outcome" -> Element(outcomeBytes))
+          })
+        )
+
+        DLCTLVTestVector(tlv, "enum_event_descriptor_v0", fields)
+      case RangeEventDescriptorV0TLV(start, stop, step, units, precision) =>
+        val fields = Vector(
+          "tpe" -> Element(RangeEventDescriptorV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "start" -> Element(start),
+          "stop" -> Element(stop),
+          "step" -> Element(step),
+          "units" -> Element(CryptoUtil.serializeForHash(units)),
+          "precision" -> Element(precision)
+        )
+
+        DLCTLVTestVector(tlv, "range_event_descriptor_v0", fields)
+      case SignedDigitDecompositionEventDescriptor(base,
+                                                   numDigits,
+                                                   units,
+                                                   precision) =>
+        val fields = Vector(
+          "tpe" -> Element(RangeEventDescriptorV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "base" -> Element(base),
+          "numDigits" -> Element(numDigits),
+          "isSigned" -> Element(ByteVector.fromByte(0x01)),
+          "units" -> Element(CryptoUtil.serializeForHash(units)),
+          "precision" -> Element(precision)
+        )
+
+        DLCTLVTestVector(tlv, "range_event_descriptor_v0", fields)
+      case UnsignedDigitDecompositionEventDescriptor(base,
+                                                     numDigits,
+                                                     units,
+                                                     precision) =>
+        val fields = Vector(
+          "tpe" -> Element(RangeEventDescriptorV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "base" -> Element(base),
+          "numDigits" -> Element(numDigits),
+          "isSigned" -> Element(ByteVector.fromByte(0x00)),
+          "units" -> Element(CryptoUtil.serializeForHash(units)),
+          "precision" -> Element(precision)
+        )
+
+        DLCTLVTestVector(tlv, "range_event_descriptor_v0", fields)
+      case OracleEventV0TLV(nonces, eventMaturity, descriptor, uri) =>
+        val fields = Vector(
+          "tpe" -> Element(OracleEventV0TLV.tpe),
+          "length" -> Element(tlv.length),
+          "oracleNonces" -> MultiElement(nonces.map(Element(_))),
+          "eventMaturityEpoch" -> Element(eventMaturity),
+          "eventDescriptor" -> Element(descriptor),
+          "event_uri" -> Element(CryptoUtil.serializeForHash(uri))
+        )
+
+        DLCTLVTestVector(tlv, "oracle_event_v0", fields)
+      case OracleAnnouncementV0TLV(sig, pubkey, event) =>
+        val fields = Vector(
+          "tpe" -> Element(UInt16(OracleAnnouncementV0TLV.tpe.toInt)),
+          "signature" -> Element(sig),
+          "oraclePubKey" -> Element(pubkey),
+          "oracleEvent" -> Element(event)
+        )
+
+        DLCMessageTestVector(LnMessage(tlv), "oracle_announcement_v0", fields)
+      case _: UnknownTLV | _: ErrorTLV | _: PingTLV | _: PongTLV =>
+        throw new IllegalArgumentException(
+          s"DLCParsingTestVector is only defined for DLC messages and TLVs, got $tlv")
+    }
+  }
+
+  def flattenJsResult[T](vec: Vector[JsResult[T]]): JsResult[Vector[T]] = {
+    vec.foldLeft[JsResult[Vector[T]]](JsSuccess(Vector.empty)) {
+      case (vecResult, elemResult) =>
+        vecResult.flatMap { vec =>
+          elemResult.map { elem =>
+            vec :+ elem
+          }
+        }
+    }
+  }
+
+  override def fromJson(json: JsValue): JsResult[DLCParsingTestVector] = {
+    for {
+      outer <- json.validate[Map[String, JsValue]]
+      inputBytes <-
+        outer("input").validate[String].map(ByteVector.fromValidHex(_))
+      tpeName <- outer("tpeName").validate[String]
+      jsFields <- outer("fields").validate[JsObject].map(_.fields.toVector)
+      fields <- flattenJsResult {
+        jsFields.map {
+          case (name, field) =>
+            ByteVectorWrapper.fromJson(field).map(name -> _)
+        }
+      }
+    } yield {
+      val msgTpe = UInt16(inputBytes.take(2)).toInt
+      if (TLV.knownTypes.contains(BigSizeUInt(msgTpe))) {
+        DLCMessageTestVector(LnMessage(inputBytes), tpeName, fields)
+      } else {
+        DLCTLVTestVector(TLV(inputBytes), tpeName, fields)
+      }
+    }
+  }
+
+  def tlvFromJson(input: JsValue): JsResult[TLV] = {
+    val inputBytesResult =
+      input.validate[String].map(ByteVector.fromValidHex(_))
+    inputBytesResult.map { inputBytes =>
+      val msgTpe = UInt16(inputBytes.take(2)).toInt
+      if (TLV.knownTypes.contains(BigSizeUInt(msgTpe))) {
+        LnMessage(inputBytes).tlv
+      } else {
+        TLV(inputBytes)
+      }
+    }
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCParsingTestVectorGen.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCParsingTestVectorGen.scala
new file mode 100644
index 0000000000..5f8e63dac4
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCParsingTestVectorGen.scala
@@ -0,0 +1,42 @@
+package org.bitcoins.dlc.testgen
+
+import java.io.File
+
+import org.bitcoins.core.protocol.tlv.TLV
+import play.api.libs.json.{JsResult, JsValue}
+
+import scala.concurrent.Future
+
+object DLCParsingTestVectorGen
+    extends TestVectorGen[DLCParsingTestVector, TLV] {
+
+  override val defaultTestFile: File = new File(
+    "dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_message_test.json")
+
+  override val testVectorParser: DLCParsingTestVector.type =
+    DLCParsingTestVector
+
+  override def inputFromJson: JsValue => JsResult[TLV] =
+    DLCParsingTestVector.tlvFromJson
+
+  override val inputStr: String = "input"
+
+  override def generateFromInput: TLV => Future[DLCParsingTestVector] = { tlv =>
+    Future.successful(DLCParsingTestVector(tlv))
+  }
+
+  override def generateTestVectors(): Future[Vector[DLCParsingTestVector]] = {
+    Future.successful(
+      Vector(
+        DLCTLVGen.contractInfoParsingTestVector(),
+        DLCTLVGen.oracleInfoParsingTestVector(),
+        DLCTLVGen.fundingInputParsingTestVector(),
+        DLCTLVGen.cetSigsParsingTestVector(),
+        DLCTLVGen.fundingSigsParsingTestVector(),
+        DLCTLVGen.dlcOfferParsingTestVector(),
+        DLCTLVGen.dlcAcceptParsingTestVector(),
+        DLCTLVGen.dlcSignParsingTestVector()
+      )
+    )
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTLVGen.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTLVGen.scala
new file mode 100644
index 0000000000..e2a0b54e3d
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTLVGen.scala
@@ -0,0 +1,398 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc._
+import org.bitcoins.core.config.{NetworkParameters, RegTest}
+import org.bitcoins.core.currency.{CurrencyUnit, CurrencyUnits, Satoshis}
+import org.bitcoins.core.number.{UInt16, UInt32}
+import org.bitcoins.core.protocol._
+import org.bitcoins.core.protocol.script._
+import org.bitcoins.core.protocol.tlv._
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.core.util.NumberUtil
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import scodec.bits.ByteVector
+
+object DLCTLVGen {
+
+  val defaultAmt: Satoshis = CurrencyUnits.oneBTC.satoshis
+
+  def hash(bytes: ByteVector = NumberUtil.randomBytes(32)): Sha256Digest = {
+    CryptoUtil.sha256(bytes)
+  }
+
+  def genContractInfo(
+      outcomes: Vector[String] = DLCTestUtil.genOutcomes(3),
+      totalInput: CurrencyUnit = defaultAmt * 2): SingleNonceContractInfo = {
+    DLCTestUtil.genContractInfos(outcomes, totalInput)._1
+  }
+
+  def contractInfoParsingTestVector(
+      outcomes: Vector[String] = DLCTestUtil.genOutcomes(3),
+      totalInput: CurrencyUnit = defaultAmt * 2): DLCParsingTestVector = {
+    DLCParsingTestVector(genContractInfo(outcomes, totalInput).toTLV)
+  }
+
+  def genOracleInfo(
+      oraclePubKey: SchnorrPublicKey =
+        ECPublicKey.freshPublicKey.schnorrPublicKey,
+      oracleRValue: SchnorrNonce =
+        ECPublicKey.freshPublicKey.schnorrNonce): SingleNonceOracleInfo = {
+    SingleNonceOracleInfo(oraclePubKey, oracleRValue)
+  }
+
+  def genOracleAndContractInfo(
+      oraclePubKey: SchnorrPublicKey =
+        ECPublicKey.freshPublicKey.schnorrPublicKey,
+      oracleRValue: SchnorrNonce = ECPublicKey.freshPublicKey.schnorrNonce,
+      outcomes: Vector[String] = DLCTestUtil.genOutcomes(3),
+      totalInput: CurrencyUnit = defaultAmt * 2): OracleAndContractInfo = {
+    OracleAndContractInfo(genOracleInfo(oraclePubKey, oracleRValue),
+                          genContractInfo(outcomes, totalInput))
+  }
+
+  def oracleInfoParsingTestVector(
+      oraclePubKey: SchnorrPublicKey =
+        ECPublicKey.freshPublicKey.schnorrPublicKey,
+      oracleRValue: SchnorrNonce =
+        ECPublicKey.freshPublicKey.schnorrNonce): DLCParsingTestVector = {
+    DLCParsingTestVector(genOracleInfo(oraclePubKey, oracleRValue).toTLV)
+  }
+
+  def p2wpkh(
+      pubKey: ECPublicKey = ECPublicKey.freshPublicKey): P2WPKHWitnessSPKV0 = {
+    P2WPKHWitnessSPKV0(pubKey)
+  }
+
+  def address(
+      spk: ScriptPubKey = p2wpkh(),
+      network: NetworkParameters = RegTest): BitcoinAddress = {
+    spk match {
+      case wspk: WitnessScriptPubKey => Bech32Address(wspk, network)
+      case p2sh: P2SHScriptPubKey    => P2SHAddress(p2sh, network)
+      case p2pkh: P2PKHScriptPubKey  => P2PKHAddress(p2pkh, network)
+      case _: RawScriptPubKey =>
+        throw new IllegalArgumentException(s"$spk is not valid for an address")
+    }
+  }
+
+  def inputTransaction(
+      input: CurrencyUnit = defaultAmt,
+      spk: ScriptPubKey = p2wpkh()): Transaction = {
+    BaseTransaction(
+      TransactionConstants.validLockVersion,
+      Vector.empty,
+      Vector(TransactionOutput(input * 2, spk)),
+      UInt32.zero
+    )
+  }
+
+  def outputReference(
+      input: CurrencyUnit = defaultAmt,
+      spk: ScriptPubKey =
+        P2WPKHWitnessSPKV0(ECPublicKey.freshPublicKey)): OutputReference = {
+    val tx = inputTransaction(input, spk)
+    OutputReference(TransactionOutPoint(tx.txIdBE, UInt32.zero),
+                    tx.outputs.head)
+  }
+
+  def fundingInput(
+      prevTx: Transaction = inputTransaction(),
+      prevTxVout: UInt32 = UInt32.zero,
+      sequence: UInt32 = TransactionConstants.sequence,
+      maxWitnessLen: UInt16 = UInt16(107),
+      redeemScriptOpt: Option[WitnessScriptPubKey] = None): DLCFundingInput = {
+    DLCFundingInput(prevTx,
+                    prevTxVout,
+                    sequence,
+                    maxWitnessLen,
+                    redeemScriptOpt)
+  }
+
+  def fundingInputParsingTestVector(
+      prevTx: Transaction = inputTransaction(),
+      prevTxVout: UInt32 = UInt32.zero,
+      sequence: UInt32 = TransactionConstants.sequence,
+      maxWitnessLen: UInt16 = UInt16(107),
+      redeemScriptOpt: Option[WitnessScriptPubKey] =
+        None): DLCParsingTestVector = {
+    DLCParsingTestVector(
+      fundingInput(prevTx,
+                   prevTxVout,
+                   sequence,
+                   maxWitnessLen,
+                   redeemScriptOpt).toTLV)
+  }
+
+  def adaptorSig: ECAdaptorSignature = {
+    ECAdaptorSignature(
+      ECPublicKey.freshPublicKey,
+      ECPrivateKey.freshPrivateKey.fieldElement,
+      ECPublicKey.freshPublicKey,
+      ECPrivateKey.freshPrivateKey.fieldElement,
+      ECPrivateKey.freshPrivateKey.fieldElement
+    )
+  }
+
+  def ecdsaSig(sigHashByte: Boolean = true): ECDigitalSignature = {
+    val sigWithoutSigHash = ECDigitalSignature.fromRS(
+      ECPrivateKey.freshPrivateKey.fieldElement.toBigInteger,
+      ECPrivateKey.freshPrivateKey.fieldElement.toBigInteger)
+
+    if (sigHashByte) {
+      ECDigitalSignature(sigWithoutSigHash.bytes :+ 0x01)
+    } else {
+      sigWithoutSigHash
+    }
+  }
+
+  def partialSig(
+      pubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      sigHashByte: Boolean = true): PartialSignature = {
+    PartialSignature(pubKey, ecdsaSig(sigHashByte))
+  }
+
+  def p2wpkhWitnessV0(
+      pubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      sigHashByte: Boolean = true): P2WPKHWitnessV0 = {
+    P2WPKHWitnessV0(pubKey, ecdsaSig(sigHashByte))
+  }
+
+  def cetSigs(
+      outcomes: Vector[DLCOutcomeType] =
+        DLCTestUtil.genOutcomes(3).map(EnumOutcome.apply),
+      fundingPubKey: ECPublicKey =
+        ECPublicKey.freshPublicKey): CETSignatures = {
+    CETSignatures(outcomes.map(outcome => outcome -> adaptorSig),
+                  partialSig(fundingPubKey, sigHashByte = false))
+  }
+
+  def cetSigsParsingTestVector(numOutcomes: Int = 3): DLCParsingTestVector = {
+    DLCParsingTestVector(
+      CETSignaturesV0TLV((0 until numOutcomes).toVector.map(_ => adaptorSig)))
+  }
+
+  def fundingSigs(
+      outPoints: Vector[TransactionOutPoint] = Vector(
+        outputReference().outPoint)): FundingSignatures = {
+    FundingSignatures(outPoints.map(outpoint => outpoint -> p2wpkhWitnessV0()))
+  }
+
+  def fundingSigsParsingTestVector(
+      outPoints: Vector[TransactionOutPoint] = Vector(
+        outputReference().outPoint)): DLCParsingTestVector = {
+    DLCParsingTestVector(fundingSigs(outPoints).toTLV)
+  }
+
+  def dlcOffer(
+      oracleAndContractInfo: OracleAndContractInfo = genOracleAndContractInfo(),
+      fundingPubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      payoutAddress: BitcoinAddress = address(),
+      totalCollateral: Satoshis = defaultAmt,
+      fundingInputs: Vector[DLCFundingInput] = Vector(fundingInput()),
+      changeAddress: BitcoinAddress = address(),
+      feeRate: SatoshisPerVirtualByte = SatoshisPerVirtualByte.one,
+      contractMaturityBound: BlockTimeStamp = BlockTimeStamp(100),
+      contractTimeout: BlockTimeStamp = BlockTimeStamp(200)): DLCOffer = {
+    DLCOffer(
+      oracleAndContractInfo,
+      DLCPublicKeys(fundingPubKey, payoutAddress),
+      totalCollateral,
+      fundingInputs,
+      changeAddress,
+      feeRate,
+      DLCTimeouts(contractMaturityBound, contractTimeout)
+    )
+  }
+
+  def dlcOfferTLV(
+      oracleAndContractInfo: OracleAndContractInfo = genOracleAndContractInfo(),
+      fundingPubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      payoutAddress: BitcoinAddress = address(),
+      totalCollateral: Satoshis = defaultAmt,
+      fundingInputs: Vector[DLCFundingInput] = Vector(fundingInput()),
+      changeAddress: BitcoinAddress = address(),
+      feeRate: SatoshisPerVirtualByte = SatoshisPerVirtualByte.one,
+      contractMaturityBound: BlockTimeStamp = BlockTimeStamp(100),
+      contractTimeout: BlockTimeStamp = BlockTimeStamp(200)): DLCOfferTLV = {
+    dlcOffer(oracleAndContractInfo,
+             fundingPubKey,
+             payoutAddress,
+             totalCollateral,
+             fundingInputs,
+             changeAddress,
+             feeRate,
+             contractMaturityBound,
+             contractTimeout).toTLV
+  }
+
+  def dlcOfferParsingTestVector(
+      oracleAndContractInfo: OracleAndContractInfo = genOracleAndContractInfo(),
+      fundingPubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      payoutAddress: BitcoinAddress = address(),
+      totalCollateral: Satoshis = defaultAmt,
+      fundingInputs: Vector[DLCFundingInput] = Vector(fundingInput()),
+      changeAddress: BitcoinAddress = address(),
+      feeRate: SatoshisPerVirtualByte = SatoshisPerVirtualByte.one,
+      contractMaturityBound: BlockTimeStamp = BlockTimeStamp(100),
+      contractTimeout: BlockTimeStamp =
+        BlockTimeStamp(200)): DLCParsingTestVector = {
+    DLCParsingTestVector(
+      dlcOfferTLV(oracleAndContractInfo,
+                  fundingPubKey,
+                  payoutAddress,
+                  totalCollateral,
+                  fundingInputs,
+                  changeAddress,
+                  feeRate,
+                  contractMaturityBound,
+                  contractTimeout))
+  }
+
+  def dlcAccept(
+      totalCollateral: Satoshis = defaultAmt,
+      fundingPubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      payoutAddress: BitcoinAddress = address(),
+      fundingInputs: Vector[DLCFundingInput] = Vector(fundingInput()),
+      changeAddress: BitcoinAddress = address(),
+      cetSignatures: CETSignatures = cetSigs(),
+      tempContractId: Sha256Digest = hash()): DLCAccept = {
+    DLCAccept(totalCollateral,
+              DLCPublicKeys(fundingPubKey, payoutAddress),
+              fundingInputs,
+              changeAddress,
+              cetSignatures,
+              tempContractId)
+  }
+
+  def dlcAcceptTLV(
+      totalCollateral: Satoshis = defaultAmt,
+      fundingPubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      payoutAddress: BitcoinAddress = address(),
+      fundingInputs: Vector[DLCFundingInput] = Vector(fundingInput()),
+      changeAddress: BitcoinAddress = address(),
+      cetSignatures: CETSignatures = cetSigs(),
+      tempContractId: Sha256Digest = hash()): DLCAcceptTLV = {
+    dlcAccept(totalCollateral,
+              fundingPubKey,
+              payoutAddress,
+              fundingInputs,
+              changeAddress,
+              cetSignatures,
+              tempContractId).toTLV
+  }
+
+  def dlcAcceptParsingTestVector(
+      totalCollateral: Satoshis = defaultAmt,
+      fundingPubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      payoutAddress: BitcoinAddress = address(),
+      fundingInputs: Vector[DLCFundingInput] = Vector(fundingInput()),
+      changeAddress: BitcoinAddress = address(),
+      cetSignatures: CETSignatures = cetSigs(),
+      tempContractId: Sha256Digest = hash()): DLCParsingTestVector = {
+    DLCParsingTestVector(
+      dlcAcceptTLV(totalCollateral,
+                   fundingPubKey,
+                   payoutAddress,
+                   fundingInputs,
+                   changeAddress,
+                   cetSignatures,
+                   tempContractId))
+  }
+
+  def dlcAcceptFromOffer(
+      offer: DLCOffer,
+      overCollateral: Satoshis = Satoshis.zero,
+      fundingPubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      payoutAddress: BitcoinAddress = address(),
+      fundingInputs: Vector[DLCFundingInput] = Vector(fundingInput()),
+      changeAddress: BitcoinAddress = address()): DLCAccept = {
+    val totalCollateral =
+      offer.contractInfo.max - offer.totalCollateral + overCollateral
+
+    val cetSignatures =
+      cetSigs(offer.oracleAndContractInfo.allOutcomes, fundingPubKey)
+
+    val tempContractId = offer.tempContractId
+
+    DLCAccept(totalCollateral.satoshis,
+              DLCPublicKeys(fundingPubKey, payoutAddress),
+              fundingInputs,
+              changeAddress,
+              cetSignatures,
+              tempContractId)
+  }
+
+  def dlcAcceptTLVFromOffer(
+      offer: DLCOffer,
+      overCollateral: Satoshis = Satoshis.zero,
+      fundingPubKey: ECPublicKey = ECPublicKey.freshPublicKey,
+      payoutAddress: BitcoinAddress = address(),
+      fundingInputs: Vector[DLCFundingInput] = Vector(fundingInput()),
+      changeAddress: BitcoinAddress = address()): DLCAcceptTLV = {
+    dlcAcceptFromOffer(offer,
+                       overCollateral,
+                       fundingPubKey,
+                       payoutAddress,
+                       fundingInputs,
+                       changeAddress).toTLV
+  }
+
+  def dlcSign(
+      cetSignatures: CETSignatures = cetSigs(),
+      fundingSignatures: FundingSignatures = fundingSigs(),
+      contractId: ByteVector = hash().bytes): DLCSign = {
+    DLCSign(cetSignatures, fundingSignatures, contractId)
+  }
+
+  def dlcSignTLV(
+      cetSignatures: CETSignatures = cetSigs(),
+      fundingSignatures: FundingSignatures = fundingSigs(),
+      contractId: ByteVector = hash().bytes): DLCSignTLV = {
+    dlcSign(cetSignatures, fundingSignatures, contractId).toTLV
+  }
+
+  def dlcSignParsingTestVector(
+      cetSignatures: CETSignatures = cetSigs(),
+      fundingSignatures: FundingSignatures = fundingSigs(),
+      contractId: ByteVector = hash().bytes): DLCParsingTestVector = {
+    DLCParsingTestVector(
+      dlcSignTLV(cetSignatures, fundingSignatures, contractId))
+  }
+
+  def dlcSignFromOffer(
+      offer: DLCOffer,
+      contractId: ByteVector = hash().bytes): DLCSign = {
+    val cetSignatures =
+      cetSigs(offer.oracleAndContractInfo.allOutcomes, offer.pubKeys.fundingKey)
+    val fundingSignatures = fundingSigs(offer.fundingInputs.map(_.outPoint))
+    DLCSign(cetSignatures, fundingSignatures, contractId)
+  }
+
+  def dlcSignTLVFromOffer(
+      offer: DLCOffer,
+      contractId: ByteVector = hash().bytes): DLCSignTLV = {
+    dlcSignFromOffer(offer, contractId).toTLV
+  }
+
+  def dlcSignFromOfferAndAccept(offer: DLCOffer, accept: DLCAccept): DLCSign = {
+    import scala.concurrent.duration.DurationInt
+    import scala.concurrent.{Await, ExecutionContext}
+
+    val builder =
+      DLCTxBuilder(offer, accept.withoutSigs)(ExecutionContext.global)
+    val fundingTx = Await.result(builder.buildFundingTx, 5.seconds)
+    val contractId = fundingTx.txIdBE.bytes.xor(accept.tempContractId.bytes)
+
+    dlcSignFromOffer(offer, contractId)
+  }
+
+  def dlcSignTLVFromOfferAndAccept(
+      offer: DLCOffer,
+      accept: DLCAccept): DLCSignTLV = {
+    dlcSignFromOfferAndAccept(offer, accept).toTLV
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestUtil.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestUtil.scala
new file mode 100644
index 0000000000..1d94ad25e1
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestUtil.scala
@@ -0,0 +1,151 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.{
+  MultiNonceContractInfo,
+  SingleNonceContractInfo
+}
+import org.bitcoins.commons.jsonmodels.dlc.{
+  CETSignatures,
+  FundingSignatures,
+  OutcomeValueFunction,
+  OutcomeValuePoint
+}
+import org.bitcoins.core.currency.{CurrencyUnit, Satoshis}
+import org.bitcoins.core.protocol.script.{
+  EmptyScriptPubKey,
+  P2WPKHWitnessV0,
+  P2WSHWitnessV0,
+  ScriptWitnessV0
+}
+import org.bitcoins.core.protocol.tlv.EnumOutcome
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.core.util.NumberUtil
+import org.bitcoins.crypto.{ECAdaptorSignature, ECDigitalSignature}
+import scodec.bits.ByteVector
+
+object DLCTestUtil {
+
+  def genOutcomes(size: Int): Vector[String] = {
+    (0 until size).map(_ => scala.util.Random.nextLong().toString).toVector
+  }
+
+  def genValues(size: Int, totalAmount: CurrencyUnit): Vector[Satoshis] = {
+    val vals = if (size < 2) {
+      throw new IllegalArgumentException(
+        s"Size must be at least two, got $size")
+    } else if (size == 2) {
+      Vector(totalAmount.satoshis, Satoshis.zero)
+    } else {
+      (0 until size - 2).map { _ =>
+        Satoshis(NumberUtil.randomLong(totalAmount.satoshis.toLong))
+      }.toVector :+ totalAmount.satoshis :+ Satoshis.zero
+    }
+
+    val valsWithOrder = vals.map(_ -> scala.util.Random.nextDouble())
+    valsWithOrder.sortBy(_._2).map(_._1)
+  }
+
+  def genContractInfos(outcomes: Vector[String], totalInput: CurrencyUnit): (
+      SingleNonceContractInfo,
+      SingleNonceContractInfo) = {
+    val outcomeMap =
+      outcomes
+        .map(EnumOutcome.apply)
+        .zip(DLCTestUtil.genValues(outcomes.length, totalInput))
+
+    val info = SingleNonceContractInfo(outcomeMap)
+    val remoteInfo = info.flip(totalInput.satoshis)
+
+    (info, remoteInfo)
+  }
+
+  /** Generates a collared forward contract */
+  def genMultiDigitContractInfo(
+      numDigits: Int,
+      totalCollateral: CurrencyUnit): (
+      MultiNonceContractInfo,
+      MultiNonceContractInfo) = {
+    val overMaxValue = Math.pow(10, numDigits).toLong
+    // Left collar goes from [0, botCollar]
+    val botCollar = NumberUtil.randomLong(overMaxValue / 2)
+    val halfWindow = scala.math.min(overMaxValue / 4, 2500)
+    val topCollarDiff = NumberUtil.randomLong(halfWindow)
+    // Right collar goes from [topCollar, overMaxValue)
+    val topCollar = botCollar + halfWindow + topCollarDiff
+    val isGoingLong = scala.util.Random.nextBoolean()
+    // leftVal and rightVal determine whether the contract shape
+    // goes from total to 0 or 0 to total
+    val (leftVal, rightVal) =
+      if (isGoingLong) (Satoshis.zero, totalCollateral.satoshis)
+      else (totalCollateral.satoshis, Satoshis.zero)
+    val func = OutcomeValueFunction(
+      Vector(
+        OutcomeValuePoint(0, leftVal, isEndpoint = true),
+        OutcomeValuePoint(botCollar, leftVal, isEndpoint = true),
+        OutcomeValuePoint(topCollar, rightVal, isEndpoint = true),
+        OutcomeValuePoint(overMaxValue - 1, rightVal, isEndpoint = true)
+      ))
+    val info = MultiNonceContractInfo(func,
+                                      base = 10,
+                                      numDigits,
+                                      totalCollateral.satoshis)
+    val remoteInfo = info.flip(totalCollateral.satoshis)
+    (info, remoteInfo)
+  }
+
+  def flipAtIndex(bytes: ByteVector, byteIndex: Int): ByteVector = {
+    val (front, backWithToFlip) = bytes.splitAt(byteIndex)
+    val (toFlip, back) = backWithToFlip.splitAt(1)
+    front ++ toFlip.xor(ByteVector.fromByte(1)) ++ back
+  }
+
+  def flipBit(signature: ECDigitalSignature): ECDigitalSignature = {
+    ECDigitalSignature(flipAtIndex(signature.bytes, 60))
+  }
+
+  def flipBit(partialSignature: PartialSignature): PartialSignature = {
+    partialSignature.copy(signature = flipBit(partialSignature.signature))
+  }
+
+  def flipBit(adaptorSignature: ECAdaptorSignature): ECAdaptorSignature = {
+    ECAdaptorSignature(flipAtIndex(adaptorSignature.bytes, 40))
+  }
+
+  def flipBit(witness: ScriptWitnessV0): ScriptWitnessV0 = {
+    witness match {
+      case p2wpkh: P2WPKHWitnessV0 =>
+        P2WPKHWitnessV0(p2wpkh.pubKey, flipBit(p2wpkh.signature))
+      case p2wsh: P2WSHWitnessV0 =>
+        val sigOpt = p2wsh.stack.zipWithIndex.find {
+          case (bytes, _) =>
+            bytes.length >= 67 && bytes.length <= 73
+        }
+
+        sigOpt match {
+          case Some((sig, index)) =>
+            P2WSHWitnessV0(
+              EmptyScriptPubKey,
+              p2wsh.stack.updated(index,
+                                  flipBit(ECDigitalSignature(sig)).bytes))
+          case None =>
+            P2WSHWitnessV0(
+              EmptyScriptPubKey,
+              p2wsh.stack.updated(0, flipAtIndex(p2wsh.stack.head, 0)))
+        }
+    }
+  }
+
+  def flipBit(fundingSigs: FundingSignatures): FundingSignatures = {
+    val (firstOutPoint, witness) = fundingSigs.head
+    val badWitness = flipBit(witness)
+    FundingSignatures(fundingSigs.tail.toVector.+:(firstOutPoint -> badWitness))
+  }
+
+  def flipBit(cetSigs: CETSignatures): CETSignatures = {
+    val badOutcomeSigs = cetSigs.outcomeSigs.map {
+      case (outcome, sig) => outcome -> flipBit(sig)
+    }
+    val badRefundSig = flipBit(cetSigs.refundSig)
+    CETSignatures(badOutcomeSigs, badRefundSig)
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestVector.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestVector.scala
new file mode 100644
index 0000000000..dfc78dbffc
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestVector.scala
@@ -0,0 +1,330 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc.{
+  DLCFundingInput,
+  DLCPublicKeys,
+  DLCTimeouts
+}
+import org.bitcoins.core.currency.{CurrencyUnit, Satoshis}
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.script.{
+  ScriptWitness,
+  ScriptWitnessV0,
+  WitnessScriptPubKey
+}
+import org.bitcoins.core.protocol.tlv._
+import org.bitcoins.core.protocol.transaction.{
+  OutputReference,
+  Transaction,
+  TransactionOutPoint
+}
+import org.bitcoins.core.protocol.{BitcoinAddress, BlockTimeStamp}
+import org.bitcoins.core.script.crypto.HashType
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.core.wallet.utxo.{
+  ConditionalPath,
+  InputInfo,
+  ScriptSignatureParams
+}
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import play.api.libs.json._
+import scodec.bits.ByteVector
+
+import scala.concurrent.{ExecutionContext, Future}
+
+sealed trait DLCTestVector extends TestVector
+
+object DLCTestVector extends TestVectorParser[DLCTestVector] {
+
+  def fromJson(json: JsValue): JsResult[DLCTestVector] = {
+    SuccessTestVector.fromJson(json)
+  }
+}
+
+case class FundingInputTx(
+    tx: Transaction,
+    idx: Int,
+    inputKeys: Vector[ECPrivateKey],
+    redeemScript: Option[WitnessScriptPubKey],
+    scriptWitness: ScriptWitnessV0) {
+
+  val outputRef: OutputReference =
+    OutputReference(TransactionOutPoint(tx.txId, UInt32(idx)), tx.outputs(idx))
+
+  lazy val scriptSignatureParams: ScriptSignatureParams[InputInfo] = {
+    ScriptSignatureParams(
+      InputInfo(TransactionOutPoint(tx.txId, UInt32(idx)),
+                tx.outputs(idx),
+                redeemScript,
+                Some(scriptWitness),
+                ConditionalPath.NoCondition),
+      tx,
+      inputKeys,
+      HashType.sigHashAll
+    )
+  }
+
+  def toFundingInput: DLCFundingInput = {
+    DLCFundingInput.fromInputSigningInfo(scriptSignatureParams)
+  }
+
+  def toSerializedFundingInputTx: SerializedFundingInputTx = {
+    SerializedFundingInputTx(tx,
+                             idx,
+                             inputKeys,
+                             redeemScript,
+                             scriptWitness,
+                             scriptSignatureParams.maxWitnessLen)
+  }
+}
+
+case class SerializedFundingInputTx(
+    tx: Transaction,
+    idx: Int,
+    inputKeys: Vector[ECPrivateKey],
+    redeemScript: Option[WitnessScriptPubKey],
+    scriptWitness: ScriptWitnessV0,
+    maxWitnessLen: Int) {
+
+  def toFundingInputTx: FundingInputTx = {
+    FundingInputTx(tx, idx, inputKeys, redeemScript, scriptWitness)
+  }
+}
+
+// Currently only supports P2WPKH inputs
+case class DLCPartyParams(
+    collateral: CurrencyUnit,
+    fundingInputTxs: Vector[FundingInputTx],
+    changeAddress: BitcoinAddress,
+    fundingPrivKey: ECPrivateKey,
+    payoutAddress: BitcoinAddress) {
+
+  def fundingInputs: Vector[DLCFundingInput] =
+    fundingInputTxs.map(_.toFundingInput)
+
+  lazy val fundingScriptSigParams: Vector[ScriptSignatureParams[InputInfo]] = {
+    fundingInputTxs.map(_.scriptSignatureParams)
+  }
+
+  def toOffer(params: DLCParams): DLCOffer = {
+    DLCOffer(
+      OracleAndContractInfo(
+        params.oracleInfo,
+        SingleNonceContractInfo(params.contractInfo.map(_.toMapEntry))),
+      DLCPublicKeys(fundingPrivKey.publicKey, payoutAddress),
+      collateral.satoshis,
+      fundingInputs,
+      changeAddress,
+      params.feeRate,
+      DLCTimeouts(params.contractMaturityBound, params.contractTimeout)
+    )
+  }
+}
+
+case class SerializedContractInfoEntry(
+    preImage: String,
+    outcome: Sha256Digest,
+    localPayout: CurrencyUnit) {
+
+  def toMapEntry: (EnumOutcome, Satoshis) = {
+    EnumOutcome(preImage) -> localPayout.satoshis
+  }
+}
+
+object SerializedContractInfoEntry {
+
+  def fromContractInfo(contractInfo: SingleNonceContractInfo): Vector[
+    SerializedContractInfoEntry] = {
+    contractInfo.map {
+      case (EnumOutcome(str), amt) =>
+        SerializedContractInfoEntry(str, CryptoUtil.sha256(str), amt)
+    }.toVector
+  }
+}
+
+case class DLCParams(
+    oracleInfo: OracleInfo,
+    contractInfo: Vector[SerializedContractInfoEntry],
+    contractMaturityBound: BlockTimeStamp,
+    contractTimeout: BlockTimeStamp,
+    feeRate: SatoshisPerVirtualByte,
+    realOutcome: Sha256Digest,
+    oracleSignature: SchnorrDigitalSignature)
+
+case class ValidTestInputs(
+    params: DLCParams,
+    offerParams: DLCPartyParams,
+    acceptParams: DLCPartyParams) {
+
+  def offer: DLCOffer = offerParams.toOffer(params)
+
+  def accept: DLCAcceptWithoutSigs =
+    DLCAcceptWithoutSigs(
+      acceptParams.collateral.satoshis,
+      DLCPublicKeys(acceptParams.fundingPrivKey.publicKey,
+                    acceptParams.payoutAddress),
+      acceptParams.fundingInputs,
+      acceptParams.changeAddress,
+      offer.tempContractId
+    )
+
+  def builder(implicit ec: ExecutionContext): DLCTxBuilder =
+    DLCTxBuilder(offer, accept)
+
+  def buildTransactions(implicit
+      ec: ExecutionContext): Future[DLCTransactions] = {
+    val builder = this.builder
+    for {
+      fundingTx <- builder.buildFundingTx
+      cetFs =
+        params.contractInfo
+          .map(_.preImage)
+          .map(EnumOutcome.apply)
+          .map(builder.buildCET)
+      cets <- Future.sequence(cetFs)
+      refundTx <- builder.buildRefundTx
+    } yield DLCTransactions(fundingTx, cets, refundTx)
+  }
+}
+
+object ValidTestInputs {
+
+  def fromJson(json: JsValue): JsResult[ValidTestInputs] = {
+    Json.fromJson(json)(SuccessTestVector.validTestInputsFormat)
+  }
+}
+
+case class DLCTransactions(
+    fundingTx: Transaction,
+    cets: Vector[Transaction],
+    refundTx: Transaction)
+
+case class SuccessTestVector(
+    testInputs: ValidTestInputs,
+    offer: LnMessage[DLCOfferTLV],
+    accept: LnMessage[DLCAcceptTLV],
+    sign: LnMessage[DLCSignTLV],
+    unsignedTxs: DLCTransactions,
+    signedTxs: DLCTransactions)
+    extends DLCTestVector {
+
+  override def toJson: JsValue = {
+    Json.toJson(this)(SuccessTestVector.successTestVectorFormat)
+  }
+}
+
+object SuccessTestVector extends TestVectorParser[SuccessTestVector] {
+
+  def hexFormat[T <: NetworkElement](factory: Factory[T]): Format[T] =
+    Format[T](
+      { hex => hex.validate[String].map(factory.fromHex) },
+      { element => JsString(element.hex) }
+    )
+
+  implicit val oracleInfoFormat: Format[OracleInfo] = Format[OracleInfo](
+    {
+      _.validate[Map[String, String]]
+        .map(map =>
+          SingleNonceOracleInfo(SchnorrPublicKey(map("publicKey")),
+                                SchnorrNonce(map("nonce"))))
+    },
+    { info =>
+      Json.toJson(
+        Map("publicKey" -> info.pubKey.hex, "nonce" -> info.nonces.head.hex))
+    }
+  )
+
+  implicit val blockTimeStampFormat: Format[BlockTimeStamp] =
+    Format[BlockTimeStamp](
+      { _.validate[Long].map(UInt32.apply).map(BlockTimeStamp.apply) },
+      { stamp => JsNumber(stamp.toUInt32.toLong) }
+    )
+
+  implicit val satsPerVBFormat: Format[SatoshisPerVirtualByte] =
+    Format[SatoshisPerVirtualByte](
+      {
+        _.validate[Long].map(Satoshis.apply).map(SatoshisPerVirtualByte.apply)
+      },
+      { satsPerVB => JsNumber(satsPerVB.toLong) }
+    )
+
+  implicit val sha256DigestFormat: Format[Sha256Digest] = hexFormat(
+    Sha256Digest)
+
+  implicit val schnorrDigitalSignatureFormat: Format[SchnorrDigitalSignature] =
+    hexFormat(SchnorrDigitalSignature)
+
+  implicit val currencyUnitFormat: Format[CurrencyUnit] =
+    Format[CurrencyUnit](
+      { _.validate[Long].map(Satoshis.apply) },
+      { currency => JsNumber(currency.satoshis.toLong) }
+    )
+  implicit val transactionFormat: Format[Transaction] = hexFormat(Transaction)
+  implicit val ecPrivKeyFormat: Format[ECPrivateKey] = hexFormat(ECPrivateKey)
+
+  implicit val witnessScriptPubKeyFormat: Format[WitnessScriptPubKey] =
+    Format[WitnessScriptPubKey](
+      { json => json.validate[String].map(WitnessScriptPubKey.fromAsmHex) },
+      { wspk => JsString(wspk.asmBytes.toHex) }
+    )
+
+  implicit val scriptWitnessV0Format: Format[ScriptWitnessV0] =
+    Format[ScriptWitnessV0](
+      {
+        _.validate[String]
+          .map(ByteVector.fromValidHex(_))
+          .map(ScriptWitness.fromBytes)
+          .map(_.asInstanceOf[ScriptWitnessV0])
+      },
+      { witness => JsString(witness.hex) }
+    )
+
+  implicit val serializedFundingInputTx: Format[SerializedFundingInputTx] =
+    Json.format[SerializedFundingInputTx]
+
+  implicit val fundingInputTxFormat: Format[FundingInputTx] =
+    Format[FundingInputTx](
+      { _.validate[SerializedFundingInputTx].map(_.toFundingInputTx) },
+      { inputTx =>
+        Json.toJson(inputTx.toSerializedFundingInputTx)
+      }
+    )
+
+  implicit val addressFormat: Format[BitcoinAddress] =
+    Format[BitcoinAddress](
+      { _.validate[String].map(BitcoinAddress.fromString) },
+      { address => JsString(address.toString) }
+    )
+
+  implicit val contractInfoFormat: Format[SerializedContractInfoEntry] =
+    Json.format[SerializedContractInfoEntry]
+
+  implicit val dlcParamFormat: Format[DLCParams] = Json.format[DLCParams]
+
+  implicit val DLCPartyParamsFormat: Format[DLCPartyParams] =
+    Json.format[DLCPartyParams]
+
+  implicit val offerMsgFormat: Format[LnMessage[DLCOfferTLV]] = hexFormat(
+    LnMessageFactory(DLCOfferTLV))
+
+  implicit val acceptMsgFormat: Format[LnMessage[DLCAcceptTLV]] = hexFormat(
+    LnMessageFactory(DLCAcceptTLV))
+
+  implicit val signMsgFormat: Format[LnMessage[DLCSignTLV]] = hexFormat(
+    LnMessageFactory(DLCSignTLV))
+
+  implicit val validTestInputsFormat: Format[ValidTestInputs] =
+    Json.format[ValidTestInputs]
+
+  implicit val dlcTransactionsFormat: Format[DLCTransactions] =
+    Json.format[DLCTransactions]
+
+  implicit val successTestVectorFormat: Format[SuccessTestVector] =
+    Json.format[SuccessTestVector]
+
+  override def fromJson(json: JsValue): JsResult[SuccessTestVector] = {
+    json.validate[SuccessTestVector]
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestVectorGen.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestVectorGen.scala
new file mode 100644
index 0000000000..37523e139e
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTestVectorGen.scala
@@ -0,0 +1,38 @@
+package org.bitcoins.dlc.testgen
+
+import java.io.File
+
+import play.api.libs.json._
+
+import scala.concurrent.Future
+
+object DLCTestVectorGen extends TestVectorGen[DLCTestVector, ValidTestInputs] {
+
+  override val defaultTestFile: File = new File(
+    "dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_test.json")
+
+  override val testVectorParser: DLCTestVector.type = DLCTestVector
+
+  override def inputFromJson: JsValue => JsResult[ValidTestInputs] =
+    ValidTestInputs.fromJson
+
+  override val inputStr: String = "testInputs"
+
+  override def generateFromInput: ValidTestInputs => Future[DLCTestVector] =
+    DLCTxGen.successTestVector(_)
+
+  override def generateTestVectors(): Future[Vector[DLCTestVector]] = {
+    // Happy Path
+    val numOutcomesTests =
+      Vector(2, 3, 5, 8, 100).map(DLCTxGen.randomSuccessTestVector)
+
+    val nonP2WPKHInputTests =
+      DLCTxGen.nonP2WPKHInputs.map(DLCTxGen.successTestVector(_))
+
+    val multiInputTests = DLCTxGen
+      .multiInputTests(Vector(1, 2, 5))
+      .map(DLCTxGen.successTestVector(_))
+
+    Future.sequence(numOutcomesTests ++ nonP2WPKHInputTests ++ multiInputTests)
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxGen.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxGen.scala
new file mode 100644
index 0000000000..c48e4fb19c
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxGen.scala
@@ -0,0 +1,277 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.{
+  DLCSign,
+  SingleNonceContractInfo,
+  SingleNonceOracleInfo
+}
+import org.bitcoins.core.currency.{CurrencyUnit, Satoshis}
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.script._
+import org.bitcoins.core.protocol.tlv.EnumOutcome
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.protocol.{BitcoinAddress, BlockTimeStamp}
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto.{CryptoUtil, ECPrivateKey, ECPublicKey}
+import org.bitcoins.dlc.sign.DLCTxSigner
+import scodec.bits.ByteVector
+
+import scala.concurrent.{ExecutionContext, Future}
+
+object DLCTxGen {
+  import DLCTLVGen._
+
+  def dlcParams(
+      contractInfo: SingleNonceContractInfo = genContractInfo(),
+      contractMaturityBound: BlockTimeStamp = BlockTimeStamp(100),
+      contractTimeout: BlockTimeStamp = BlockTimeStamp(200),
+      feeRate: SatoshisPerVirtualByte =
+        SatoshisPerVirtualByte(Satoshis(5))): DLCParams = {
+    val privKey = ECPrivateKey.freshPrivateKey
+    val kVal = ECPrivateKey.freshPrivateKey
+    val oracleInfo =
+      SingleNonceOracleInfo(privKey.schnorrPublicKey, kVal.schnorrNonce)
+    val realOutcome = contractInfo.keys(contractInfo.size / 2)
+    val sig =
+      privKey.schnorrSignWithNonce(CryptoUtil.sha256(realOutcome.outcome).bytes,
+                                   kVal)
+    DLCParams(
+      oracleInfo,
+      SerializedContractInfoEntry.fromContractInfo(contractInfo),
+      contractMaturityBound,
+      contractTimeout,
+      feeRate,
+      CryptoUtil.sha256(realOutcome.outcome),
+      sig
+    )
+  }
+
+  private val dummyTransactionInput = TransactionInput(
+    TransactionOutPoint(CryptoUtil.doubleSHA256(ByteVector("DLC".getBytes)),
+                        UInt32.zero),
+    EmptyScriptSignature,
+    UInt32.zero)
+
+  def fundingInputTx(
+      inputs: Vector[TransactionInput] = Vector(dummyTransactionInput),
+      idx: Int = 0,
+      privKeys: Vector[ECPrivateKey] = Vector(ECPrivateKey.freshPrivateKey),
+      redeemScriptOpt: Option[WitnessScriptPubKeyV0] = None,
+      scriptWitness: ScriptWitnessV0 = P2WPKHWitnessV0(
+        ECPublicKey.freshPublicKey),
+      amt: CurrencyUnit = defaultAmt * 2,
+      lockTime: UInt32 = UInt32.zero): FundingInputTx = {
+    val (spk, scriptWit) = redeemScriptOpt match {
+      case Some(wspk) => (P2SHScriptPubKey(wspk), scriptWitness)
+      case None =>
+        scriptWitness match {
+          case p2wpkh: P2WPKHWitnessV0 =>
+            val pubKey = if (privKeys.head.publicKey != p2wpkh.pubKey) {
+              privKeys.head.publicKey
+            } else {
+              p2wpkh.pubKey
+            }
+            (P2WPKHWitnessSPKV0(pubKey), P2WPKHWitnessV0(pubKey))
+          case p2wsh: P2WSHWitnessV0 =>
+            (P2WSHWitnessSPKV0(p2wsh.redeemScript), p2wsh)
+        }
+    }
+
+    val outputs =
+      Vector
+        .fill(idx)(TransactionOutput(defaultAmt, EmptyScriptPubKey)) :+
+        TransactionOutput(amt, spk)
+    val tx = BaseTransaction(TransactionConstants.validLockVersion,
+                             inputs,
+                             outputs,
+                             lockTime)
+
+    FundingInputTx(tx, idx, privKeys, redeemScriptOpt, scriptWit)
+  }
+
+  def multiSigFundingInputTx(
+      privKeys: Vector[ECPrivateKey] =
+        Vector(ECPrivateKey.freshPrivateKey, ECPrivateKey.freshPrivateKey),
+      requiredSigs: Int = 2,
+      p2shNested: Boolean = false,
+      idx: Int = 0,
+      amt: CurrencyUnit = defaultAmt * 2,
+      lockTime: UInt32 = UInt32.zero): FundingInputTx = {
+    val multiSig =
+      MultiSignatureScriptPubKey(requiredSigs, privKeys.map(_.publicKey))
+
+    val redeemScriptOpt = if (p2shNested) {
+      Some(P2WSHWitnessSPKV0(multiSig))
+    } else None
+
+    val scriptWitness = P2WSHWitnessV0(multiSig)
+
+    fundingInputTx(idx = idx,
+                   privKeys = privKeys,
+                   redeemScriptOpt = redeemScriptOpt,
+                   scriptWitness = scriptWitness,
+                   amt = amt,
+                   lockTime = lockTime)
+  }
+
+  def dlcPartyParams(
+      collateral: CurrencyUnit = defaultAmt,
+      fundingInputTxs: Vector[FundingInputTx] = Vector(fundingInputTx()),
+      changeAddress: BitcoinAddress = address(),
+      fundingPrivKey: ECPrivateKey = ECPrivateKey.freshPrivateKey,
+      payoutAddress: BitcoinAddress = address()): DLCPartyParams = {
+    DLCPartyParams(collateral,
+                   fundingInputTxs,
+                   changeAddress,
+                   fundingPrivKey,
+                   payoutAddress)
+  }
+
+  def validTestInputs(
+      params: DLCParams = dlcParams(),
+      offerParams: DLCPartyParams = dlcPartyParams(),
+      acceptParams: DLCPartyParams = dlcPartyParams()): ValidTestInputs = {
+    ValidTestInputs(params, offerParams, acceptParams)
+  }
+
+  def validTestInputsForInputs(
+      offerInputs: Vector[FundingInputTx],
+      acceptInputs: Vector[FundingInputTx],
+      numOutcomes: Int = 3): ValidTestInputs = {
+    val outcomes = DLCTestUtil.genOutcomes(numOutcomes)
+    val contractInfo = genContractInfo(outcomes)
+
+    validTestInputs(
+      params = dlcParams(contractInfo = contractInfo),
+      offerParams = dlcPartyParams(fundingInputTxs = offerInputs),
+      acceptParams = dlcPartyParams(fundingInputTxs = acceptInputs)
+    )
+  }
+
+  def vecProd[T](vec1: Vector[T], vec2: Vector[T]): Vector[(T, T)] = {
+    vec1.flatMap(x => vec2.map((x, _)))
+  }
+
+  val allInputs = Vector(0, 1, 2)
+
+  def inputFromKind(n: Int): FundingInputTx = {
+    if (n == 0) fundingInputTx()
+    else if (n == 1) multiSigFundingInputTx()
+    else multiSigFundingInputTx(p2shNested = true)
+  }
+
+  def inputs(n: Int): Vector[FundingInputTx] = {
+    (0 until n).toVector.map { _ =>
+      inputFromKind(scala.util.Random.nextInt(3))
+    }
+  }
+
+  def nonP2WPKHInputs: Vector[ValidTestInputs] = {
+    vecProd(allInputs, allInputs).tail.map {
+      case (offerInputKind, acceptInputKind) =>
+        validTestInputsForInputs(
+          offerInputs = Vector(inputFromKind(offerInputKind)),
+          acceptInputs = Vector(inputFromKind(acceptInputKind))
+        )
+    }
+  }
+
+  def multiInputTests(numInputOptions: Vector[Int]): Vector[ValidTestInputs] = {
+    vecProd(numInputOptions, numInputOptions).tail.map {
+      case (offerNumInputs, acceptNumInputs) =>
+        validTestInputsForInputs(
+          offerInputs = inputs(offerNumInputs),
+          acceptInputs = inputs(acceptNumInputs)
+        )
+    }
+  }
+
+  def dlcTxTestVector(inputs: ValidTestInputs = validTestInputs())(implicit
+      ec: ExecutionContext): Future[DLCTxTestVector] = {
+    DLCTxTestVector.fromInputs(inputs)
+  }
+
+  def dlcTxTestVectorWithTxInputs(
+      offerInputs: Vector[FundingInputTx],
+      acceptInputs: Vector[FundingInputTx],
+      numOutcomes: Int = 3)(implicit
+      ec: ExecutionContext): Future[DLCTxTestVector] = {
+    dlcTxTestVector(
+      validTestInputsForInputs(offerInputs, acceptInputs, numOutcomes))
+  }
+
+  def randomTxTestVector(numOutcomes: Int)(implicit
+      ec: ExecutionContext): Future[DLCTxTestVector] = {
+    val outcomes = DLCTestUtil.genOutcomes(numOutcomes)
+    val contractInfo = genContractInfo(outcomes)
+
+    dlcTxTestVector(validTestInputs(dlcParams(contractInfo = contractInfo)))
+  }
+
+  def successTestVector(inputs: ValidTestInputs = validTestInputs())(implicit
+      ec: ExecutionContext): Future[SuccessTestVector] = {
+    val offer = inputs.offer
+    val acceptWithoutSigs = inputs.accept
+
+    val builder = inputs.builder
+    val offerSigner = DLCTxSigner(builder,
+                                  isInitiator = true,
+                                  inputs.offerParams.fundingPrivKey,
+                                  inputs.offerParams.payoutAddress,
+                                  inputs.offerParams.fundingScriptSigParams)
+    val acceptSigner = DLCTxSigner(builder,
+                                   isInitiator = false,
+                                   inputs.acceptParams.fundingPrivKey,
+                                   inputs.acceptParams.payoutAddress,
+                                   inputs.acceptParams.fundingScriptSigParams)
+
+    val outcomeStr = inputs.params.contractInfo
+      .find(_.outcome == inputs.params.realOutcome)
+      .map(_.preImage)
+      .get
+    val outcome = EnumOutcome(outcomeStr)
+
+    for {
+      accpetCETSigs <- acceptSigner.createCETSigs()
+      offerCETSigs <- offerSigner.createCETSigs()
+      offerFundingSigs <- offerSigner.createFundingTxSigs()
+
+      DLCTransactions(fundingTx, cets, refundTx) <- inputs.buildTransactions
+
+      signedFundingTx <- acceptSigner.signFundingTx(offerFundingSigs)
+      signedRefundTx <- offerSigner.signRefundTx(accpetCETSigs.refundSig)
+      offerSignedCET <- offerSigner.signCET(
+        outcome,
+        accpetCETSigs(outcome),
+        Vector(inputs.params.oracleSignature))
+      acceptSignedCET <- acceptSigner.signCET(
+        outcome,
+        offerCETSigs(outcome),
+        Vector(inputs.params.oracleSignature))
+    } yield {
+      val accept = acceptWithoutSigs.withSigs(accpetCETSigs)
+
+      val contractId = fundingTx.txIdBE.bytes.xor(accept.tempContractId.bytes)
+      val sign = DLCSign(offerCETSigs, offerFundingSigs, contractId)
+
+      SuccessTestVector(
+        inputs,
+        offer.toMessage,
+        accept.toMessage,
+        sign.toMessage,
+        DLCTransactions(fundingTx, cets, refundTx),
+        DLCTransactions(signedFundingTx,
+                        Vector(offerSignedCET, acceptSignedCET),
+                        signedRefundTx)
+      )
+    }
+  }
+
+  def randomSuccessTestVector(numOutcomes: Int)(implicit
+      ec: ExecutionContext): Future[SuccessTestVector] = {
+    val outcomes = DLCTestUtil.genOutcomes(numOutcomes)
+    val contractInfo = genContractInfo(outcomes)
+
+    successTestVector(validTestInputs(dlcParams(contractInfo = contractInfo)))
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxTestVector.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxTestVector.scala
new file mode 100644
index 0000000000..45ff65d6ea
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxTestVector.scala
@@ -0,0 +1,30 @@
+package org.bitcoins.dlc.testgen
+
+import play.api.libs.json.{Format, JsResult, JsValue, Json}
+
+import scala.concurrent.{ExecutionContext, Future}
+
+case class DLCTxTestVector(inputs: ValidTestInputs, txs: DLCTransactions)
+    extends TestVector {
+
+  override def toJson: JsValue =
+    Json.toJson(this)(DLCTxTestVector.dlcTxTestVectorFormat)
+}
+
+object DLCTxTestVector extends TestVectorParser[DLCTxTestVector] {
+
+  def fromInputs(inputs: ValidTestInputs)(implicit
+      ec: ExecutionContext): Future[DLCTxTestVector] = {
+    inputs.buildTransactions.map(txs => DLCTxTestVector(inputs, txs))
+  }
+
+  import SuccessTestVector.validTestInputsFormat
+  import SuccessTestVector.dlcTransactionsFormat
+
+  implicit val dlcTxTestVectorFormat: Format[DLCTxTestVector] =
+    Json.format[DLCTxTestVector]
+
+  override def fromJson(json: JsValue): JsResult[DLCTxTestVector] = {
+    json.validate[DLCTxTestVector]
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxTestVectorGen.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxTestVectorGen.scala
new file mode 100644
index 0000000000..2a48abd89c
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/DLCTxTestVectorGen.scala
@@ -0,0 +1,38 @@
+package org.bitcoins.dlc.testgen
+
+import java.io.File
+
+import play.api.libs.json.{JsResult, JsValue}
+
+import scala.concurrent.Future
+
+object DLCTxTestVectorGen
+    extends TestVectorGen[DLCTxTestVector, ValidTestInputs] {
+
+  override val defaultTestFile: File = new File(
+    "dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_tx_test.json")
+
+  override val testVectorParser: DLCTxTestVector.type = DLCTxTestVector
+
+  override def inputFromJson: JsValue => JsResult[ValidTestInputs] =
+    ValidTestInputs.fromJson
+
+  override val inputStr: String = "inputs"
+
+  override def generateFromInput: ValidTestInputs => Future[DLCTxTestVector] =
+    DLCTxTestVector.fromInputs
+
+  override def generateTestVectors(): Future[Vector[DLCTxTestVector]] = {
+    val numOutcomesTests = Vector(2, 3, 5, 8).map(DLCTxGen.randomTxTestVector)
+
+    val nonP2WPKHInputTests =
+      DLCTxGen.nonP2WPKHInputs.map(DLCTxGen.dlcTxTestVector(_))
+
+    val numInputs = Vector(1, 2, 3, 8)
+
+    val multiInputTests =
+      DLCTxGen.multiInputTests(numInputs).map(DLCTxGen.dlcTxTestVector(_))
+
+    Future.sequence(numOutcomesTests ++ nonP2WPKHInputTests ++ multiInputTests)
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVector.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVector.scala
new file mode 100644
index 0000000000..a5d4607bd0
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVector.scala
@@ -0,0 +1,99 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.crypto._
+import play.api.libs.json._
+
+case class SchnorrSigPointTestVector(
+    inputs: SchnorrSigPointTestVectorInput,
+    pubKey: SchnorrPublicKey,
+    pubNonce: SchnorrNonce,
+    signature: SchnorrDigitalSignature,
+    sigPoint: ECPublicKey)
+    extends TestVector {
+  require(signature.sig.getPublicKey == sigPoint,
+          s"Signature ($signature) does not match Signature Point ($sigPoint)")
+
+  def privKey: ECPrivateKey = inputs.privKey
+  def privNonce: ECPrivateKey = inputs.privNonce
+  def msgHash: Sha256Digest = inputs.msgHash
+
+  override def toJson: JsValue = {
+    Json.toJson(this)(SchnorrSigPointTestVector.schnorrSigPointTestVectorFormat)
+  }
+}
+
+case class SchnorrSigPointTestVectorInput(
+    privKey: ECPrivateKey,
+    privNonce: ECPrivateKey,
+    msgHash: Sha256Digest)
+
+object SchnorrSigPointTestVectorInput {
+
+  def fromJson(json: JsValue): JsResult[SchnorrSigPointTestVectorInput] = {
+    json.validate[SchnorrSigPointTestVectorInput](
+      SchnorrSigPointTestVector.schnorrSigPointTestVectorInputFormat)
+  }
+}
+
+object SchnorrSigPointTestVector
+    extends TestVectorParser[SchnorrSigPointTestVector] {
+
+  def apply(
+      input: SchnorrSigPointTestVectorInput): SchnorrSigPointTestVector = {
+    SchnorrSigPointTestVector(input.privKey, input.privNonce, input.msgHash)
+  }
+
+  def apply(
+      privKey: ECPrivateKey,
+      privNonce: ECPrivateKey,
+      msgHash: Sha256Digest): SchnorrSigPointTestVector = {
+    val signature = privKey.schnorrSignWithNonce(msgHash.bytes, privNonce)
+    val signaturePoint = signature.sig.getPublicKey
+
+    SchnorrSigPointTestVector(
+      SchnorrSigPointTestVectorInput(privKey, privNonce, msgHash),
+      privKey.schnorrPublicKey,
+      privNonce.schnorrNonce,
+      signature,
+      signaturePoint)
+  }
+
+  def networkElementFormat[T <: NetworkElement](
+      factory: Factory[T]): Format[T] = {
+    Format[T]({ json =>
+                json.validate[String].map(factory.fromHex)
+              },
+              { element =>
+                JsString(element.hex)
+              })
+  }
+
+  implicit val privKeyFormat: Format[ECPrivateKey] = networkElementFormat(
+    ECPrivateKey)
+
+  implicit val schnorrPubKeyFormat: Format[SchnorrPublicKey] =
+    networkElementFormat(SchnorrPublicKey)
+
+  implicit val schnorrNonceFormat: Format[SchnorrNonce] = networkElementFormat(
+    SchnorrNonce)
+
+  implicit val hashFormat: Format[Sha256Digest] = networkElementFormat(
+    Sha256Digest)
+
+  implicit val signatureFormat: Format[SchnorrDigitalSignature] =
+    networkElementFormat(SchnorrDigitalSignature)
+
+  implicit val pubKeyFromat: Format[ECPublicKey] = networkElementFormat(
+    ECPublicKey)
+
+  implicit val schnorrSigPointTestVectorInputFormat: Format[
+    SchnorrSigPointTestVectorInput] =
+    Json.format[SchnorrSigPointTestVectorInput]
+
+  implicit val schnorrSigPointTestVectorFormat: Format[
+    SchnorrSigPointTestVector] = Json.format[SchnorrSigPointTestVector]
+
+  override def fromJson(json: JsValue): JsResult[SchnorrSigPointTestVector] = {
+    json.validate[SchnorrSigPointTestVector]
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVectorGen.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVectorGen.scala
new file mode 100644
index 0000000000..38c599e787
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/SchnorrSigPointTestVectorGen.scala
@@ -0,0 +1,46 @@
+package org.bitcoins.dlc.testgen
+
+import java.io.File
+
+import org.bitcoins.crypto.{ECPrivateKey, Sha256Digest}
+import play.api.libs.json.{JsResult, JsValue}
+
+import scala.concurrent.Future
+
+object SchnorrSigPointTestVectorGen
+    extends TestVectorGen[
+      SchnorrSigPointTestVector,
+      SchnorrSigPointTestVectorInput] {
+
+  override val defaultTestFile: File = new File(
+    "dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_schnorr_test.json")
+
+  override val testVectorParser: SchnorrSigPointTestVector.type =
+    SchnorrSigPointTestVector
+
+  override def inputFromJson: JsValue => JsResult[
+    SchnorrSigPointTestVectorInput] =
+    SchnorrSigPointTestVectorInput.fromJson
+
+  override val inputStr: String = "inputs"
+
+  override def generateFromInput: SchnorrSigPointTestVectorInput => Future[
+    SchnorrSigPointTestVector] = { inputs =>
+    Future.successful(SchnorrSigPointTestVector(inputs))
+  }
+
+  override def generateTestVectors(): Future[
+    Vector[SchnorrSigPointTestVector]] = {
+    def generateTest: SchnorrSigPointTestVector = {
+      SchnorrSigPointTestVector(
+        ECPrivateKey.freshPrivateKey,
+        ECPrivateKey.freshPrivateKey,
+        Sha256Digest(ECPrivateKey.freshPrivateKey.bytes)
+      )
+    }
+
+    Future.successful(
+      Vector.fill(5)(generateTest)
+    )
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestDLCClient.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestDLCClient.scala
new file mode 100644
index 0000000000..15bbe634e4
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestDLCClient.scala
@@ -0,0 +1,209 @@
+package org.bitcoins.dlc.testgen
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.{ContractInfo, OracleInfo}
+import org.bitcoins.commons.jsonmodels.dlc._
+import org.bitcoins.core.config.{BitcoinNetwork, RegTest}
+import org.bitcoins.core.currency.CurrencyUnit
+import org.bitcoins.core.protocol.BitcoinAddress
+import org.bitcoins.core.protocol.script.ScriptPubKey
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.protocol.transaction.Transaction
+import org.bitcoins.core.util.BitcoinSLogger
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.core.wallet.utxo.{InputInfo, ScriptSignatureParams}
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import org.bitcoins.dlc.execution.{
+  DLCExecutor,
+  ExecutedDLCOutcome,
+  RefundDLCOutcome,
+  SetupDLC
+}
+import org.bitcoins.dlc.sign.DLCTxSigner
+
+import scala.concurrent.duration.DurationInt
+import scala.concurrent.{Await, ExecutionContext, Future}
+
+/** This case class allows for the construction and execution of
+  * Discreet Log Contracts between two parties running on this machine (for tests).
+  *
+  * @param offer The DLCOffer associated with this DLC
+  * @param accept The DLCAccept (without sigs) associated with this DLC
+  * @param isInitiator True if this client sends the offer message
+  * @param fundingPrivKey This client's funding private key for this event
+  * @param payoutPrivKey This client's payout private key for this event
+  * @param fundingUtxos This client's funding BitcoinUTXOSpendingInfo collection
+  */
+case class TestDLCClient(
+    offer: DLCMessage.DLCOffer,
+    accept: DLCMessage.DLCAcceptWithoutSigs,
+    isInitiator: Boolean,
+    fundingPrivKey: ECPrivateKey,
+    payoutPrivKey: ECPrivateKey,
+    fundingUtxos: Vector[ScriptSignatureParams[InputInfo]])(implicit
+    ec: ExecutionContext)
+    extends BitcoinSLogger {
+  val dlcTxBuilder: DLCTxBuilder = DLCTxBuilder(offer, accept)
+
+  val dlcTxSigner: DLCTxSigner = DLCTxSigner(dlcTxBuilder,
+                                             isInitiator,
+                                             fundingPrivKey,
+                                             payoutPrivKey,
+                                             RegTest,
+                                             fundingUtxos)
+
+  private val dlcExecutor = DLCExecutor(dlcTxSigner)
+
+  val messages: Vector[DLCOutcomeType] = offer.oracleAndContractInfo.allOutcomes
+
+  val timeouts: DLCTimeouts = offer.timeouts
+
+  lazy val fundingTx: Transaction =
+    Await.result(dlcTxBuilder.buildFundingTx, 5.seconds)
+
+  lazy val fundingTxIdBE: DoubleSha256DigestBE = fundingTx.txIdBE
+
+  /** Sets up the non-initiator's DLC given functions for sending
+    * CETSignatures to the initiator as well as receiving CETSignatures
+    * and FundingSignatures from them
+    */
+  def setupDLCAccept(
+      sendSigs: CETSignatures => Future[Unit],
+      getSigs: Future[(CETSignatures, FundingSignatures)]): Future[SetupDLC] = {
+    require(!isInitiator, "You should call setupDLCOffer")
+
+    for {
+      remoteCetSigs <- dlcTxSigner.createCETSigs()
+      _ <- sendSigs(remoteCetSigs)
+      (cetSigs, fundingSigs) <- getSigs
+      setupDLC <- dlcExecutor.setupDLCAccept(cetSigs, fundingSigs)
+    } yield {
+      setupDLC
+    }
+  }
+
+  /** Sets up the initiator's DLC given functions for getting CETSignatures
+    * from the non-initiator as well as sending signatures to them, and lastly
+    * a Future which will be populated with the broadcasted (or relayed) fully
+    * signed funding transaction
+    */
+  def setupDLCOffer(
+      getSigs: Future[CETSignatures],
+      sendSigs: (CETSignatures, FundingSignatures) => Future[Unit],
+      getFundingTx: Future[Transaction]): Future[SetupDLC] = {
+    require(isInitiator, "You should call setupDLCAccept")
+
+    for {
+      cetSigs <- getSigs
+      setupDLCWithoutFundingTxSigs <- dlcExecutor.setupDLCOffer(cetSigs)
+      cetSigs <- dlcTxSigner.createCETSigs()
+      localFundingSigs <- dlcTxSigner.createFundingTxSigs()
+      _ <- sendSigs(cetSigs, localFundingSigs)
+      fundingTx <- getFundingTx
+    } yield {
+      setupDLCWithoutFundingTxSigs.copy(fundingTx = fundingTx)
+    }
+  }
+
+  def executeDLC(
+      dlcSetup: SetupDLC,
+      oracleSigsF: Future[Vector[SchnorrDigitalSignature]]): Future[
+    ExecutedDLCOutcome] = {
+    oracleSigsF.flatMap { oracleSigs =>
+      dlcExecutor.executeDLC(dlcSetup, oracleSigs)
+    }
+  }
+
+  def executeRefundDLC(dlcSetup: SetupDLC): RefundDLCOutcome = {
+    dlcExecutor.executeRefundDLC(dlcSetup)
+  }
+}
+
+object TestDLCClient {
+
+  def apply(
+      outcomes: ContractInfo,
+      oracleInfo: OracleInfo,
+      isInitiator: Boolean,
+      fundingPrivKey: ECPrivateKey,
+      payoutPrivKey: ECPrivateKey,
+      remotePubKeys: DLCPublicKeys,
+      input: CurrencyUnit,
+      remoteInput: CurrencyUnit,
+      fundingUtxos: Vector[ScriptSignatureParams[InputInfo]],
+      remoteFundingInputs: Vector[DLCFundingInput],
+      timeouts: DLCTimeouts,
+      feeRate: SatoshisPerVirtualByte,
+      changeSPK: ScriptPubKey,
+      remoteChangeSPK: ScriptPubKey,
+      network: BitcoinNetwork)(implicit ec: ExecutionContext): TestDLCClient = {
+    val pubKeys = DLCPublicKeys.fromPrivKeys(
+      fundingPrivKey,
+      payoutPrivKey,
+      network
+    )
+
+    val remoteOutcomes: ContractInfo =
+      outcomes.flip((input + remoteInput).satoshis)
+
+    val changeAddress = BitcoinAddress.fromScriptPubKey(changeSPK, network)
+    val remoteChangeAddress =
+      BitcoinAddress.fromScriptPubKey(remoteChangeSPK, network)
+
+    val (offerOutcomes,
+         offerPubKeys,
+         offerInput,
+         offerFundingInputs,
+         offerChangeAddress,
+         acceptPubKeys,
+         acceptInput,
+         acceptFundingInputs,
+         acceptChangeAddress) = if (isInitiator) {
+      (outcomes,
+       pubKeys,
+       input,
+       fundingUtxos.map(DLCFundingInput.fromInputSigningInfo(_)),
+       changeAddress,
+       remotePubKeys,
+       remoteInput,
+       remoteFundingInputs,
+       remoteChangeAddress)
+    } else {
+      (remoteOutcomes,
+       remotePubKeys,
+       remoteInput,
+       remoteFundingInputs,
+       remoteChangeAddress,
+       pubKeys,
+       input,
+       fundingUtxos.map(DLCFundingInput.fromInputSigningInfo(_)),
+       changeAddress)
+    }
+
+    val offer = DLCMessage.DLCOffer(
+      oracleAndContractInfo =
+        DLCMessage.OracleAndContractInfo(oracleInfo, offerOutcomes),
+      pubKeys = offerPubKeys,
+      totalCollateral = offerInput.satoshis,
+      fundingInputs = offerFundingInputs,
+      changeAddress = offerChangeAddress,
+      feeRate = feeRate,
+      timeouts = timeouts
+    )
+
+    val accept = DLCMessage.DLCAcceptWithoutSigs(
+      totalCollateral = acceptInput.satoshis,
+      pubKeys = acceptPubKeys,
+      fundingInputs = acceptFundingInputs,
+      changeAddress = acceptChangeAddress,
+      tempContractId = offer.tempContractId
+    )
+
+    TestDLCClient(offer,
+                  accept,
+                  isInitiator,
+                  fundingPrivKey,
+                  payoutPrivKey,
+                  fundingUtxos)
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestVector.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestVector.scala
new file mode 100644
index 0000000000..5e777e81fc
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestVector.scala
@@ -0,0 +1,19 @@
+package org.bitcoins.dlc.testgen
+
+import play.api.libs.json.{JsResult, JsValue, Json}
+
+trait TestVector {
+  def toJson: JsValue
+
+  def toJsonStr: String = {
+    Json.prettyPrint(toJson)
+  }
+}
+
+trait TestVectorParser[T <: TestVector] {
+  def fromJson(json: JsValue): JsResult[T]
+
+  def fromString(str: String): JsResult[T] = {
+    fromJson(Json.parse(str))
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestVectorGen.scala b/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestVectorGen.scala
new file mode 100644
index 0000000000..1e4bf462d5
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/TestVectorGen.scala
@@ -0,0 +1,121 @@
+package org.bitcoins.dlc.testgen
+
+import java.io.{File, PrintWriter}
+
+import play.api.libs.json.{JsArray, JsError, JsResult, JsSuccess, JsValue, Json}
+
+import scala.concurrent.{ExecutionContext, Future}
+import scala.io.Source
+import scala.util.{Failure, Success, Try}
+
+trait TestVectorGen[T <: TestVector, Input] {
+
+  def testVectorParser: TestVectorParser[T]
+
+  def inputFromJson: JsValue => JsResult[Input]
+
+  def inputStr: String
+
+  def generateFromInput: Input => Future[T]
+
+  implicit def ec: ExecutionContext = ExecutionContext.global
+
+  def defaultTestFile: File
+
+  private def writeToFile(json: JsValue, outFile: File): Unit = {
+    val writer = new PrintWriter(outFile)
+    writer.print(Json.prettyPrint(json))
+    writer.close()
+  }
+
+  def writeTestVectorsToFile(
+      vecs: Vector[T],
+      file: File = defaultTestFile): Unit = {
+    val arr = JsArray(vecs.map(_.toJson))
+    writeToFile(arr, file)
+  }
+
+  def readFromDefaultTestFile(): JsResult[Vector[T]] = {
+    val source = Source.fromFile(defaultTestFile)
+    val str = source.getLines().reduce(_ ++ _)
+    source.close()
+
+    Json.parse(str).validate[JsArray].flatMap { arr =>
+      arr.value
+        .foldLeft[JsResult[Vector[T]]](JsSuccess(Vector.empty)) {
+          case (jsResultAccum, json) =>
+            jsResultAccum.flatMap { accum =>
+              testVectorParser.fromJson(json).map { testVec =>
+                accum :+ testVec
+              }
+            }
+        }
+    }
+  }
+
+  def readInputsFromDefaultTestFile(): JsResult[Vector[Input]] = {
+    val source = Source.fromFile(defaultTestFile)
+    val str = source.getLines().reduce(_ ++ _)
+    source.close()
+
+    Json.parse(str).validate[JsArray].flatMap { arr =>
+      arr.value
+        .foldLeft[JsResult[Vector[Input]]](JsSuccess(Vector.empty)) {
+          case (jsResultAccum, json) =>
+            jsResultAccum.flatMap { accum =>
+              inputFromJson((json \ inputStr).get).map { testVec =>
+                accum :+ testVec
+              }
+            }
+        }
+    }
+  }
+
+  /** Returns true if anything has changed, false otherwise */
+  def regenerateTestFile(): Future[Boolean] = {
+    val testVecInputs = readInputsFromDefaultTestFile()
+    val testVecResultT = Try(readFromDefaultTestFile())
+
+    testVecInputs match {
+      case JsSuccess(inputs, _) =>
+        val newTestVecsF =
+          Future.sequence(inputs.map(input => generateFromInput(input)))
+        newTestVecsF.flatMap { newTestVecs =>
+          val noChange = testVecResultT match {
+            case Failure(_) | Success(JsError(_)) => false
+            case Success(JsSuccess(testVecs, _)) =>
+              newTestVecs.zip(testVecs).foldLeft(true) {
+                case (sameSoFar, (oldVec, newVec)) =>
+                  sameSoFar && (oldVec == newVec)
+              }
+          }
+
+          if (noChange) {
+            Future.successful(false)
+          } else {
+            val successfulDelete = defaultTestFile.delete()
+            if (successfulDelete) {
+              writeTestVectorsToFile(newTestVecs)
+              Future.successful(true)
+            } else {
+              Future.failed(
+                new RuntimeException(
+                  s"Was unable to delete ${defaultTestFile.getAbsolutePath}"))
+            }
+          }
+        }
+      case JsError(err) =>
+        Future.failed(
+          new IllegalArgumentException(s"Could not read json from file: $err"))
+    }
+  }
+
+  def generateTestVectors(): Future[Vector[T]]
+
+  def generateAndWriteTestVectors(
+      file: File = defaultTestFile): Future[Unit] = {
+    generateTestVectors().map { testVectors =>
+      writeTestVectorsToFile(testVectors, file)
+    }
+  }
+}
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test.json b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test.json
new file mode 100644
index 0000000000..2770a6006d
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test.json
@@ -0,0 +1,9861 @@
+[ {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 440,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 970,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 670,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 980
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 690,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 1180
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 2360,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 280,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 292,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 2920,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 2800,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 280,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 280,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 2920,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 2800,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 2800,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 2920,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 280,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 280,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 1400,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 1400,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 292,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 280,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 2800,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 2920,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 2800,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 2800,
+  "acceptClosingFee" : 880
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 630,
+  "offerClosingFee" : 490,
+  "acceptFundingFee" : 1460,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 280,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1380,
+  "offerClosingFee" : 1340,
+  "acceptFundingFee" : 2920,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 292,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 280,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 1260,
+  "offerClosingFee" : 980,
+  "acceptFundingFee" : 2800,
+  "acceptClosingFee" : 970
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 292,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 126,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 292,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 292,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 138,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 280,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 292,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 126,
+  "acceptClosingFee" : 98
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 1460,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 490
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 1460,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 2920,
+  "offerClosingFee" : 880,
+  "acceptFundingFee" : 1260,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 2920,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 2800,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 1380,
+  "acceptClosingFee" : 850
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 280,
+  "offerClosingFee" : 85,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 236
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 1460,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 690,
+  "acceptClosingFee" : 440
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 1400,
+  "offerClosingFee" : 485,
+  "acceptFundingFee" : 630,
+  "acceptClosingFee" : 485
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 22,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 34,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 292,
+  "offerClosingFee" : 97,
+  "acceptFundingFee" : 138,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 3255,
+  "offerClosingFee" : 425,
+  "acceptFundingFee" : 3195,
+  "acceptClosingFee" : 670
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 173,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 6510,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 6390,
+  "acceptClosingFee" : 2360
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 651,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 651,
+  "acceptClosingFee" : 134
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 22,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 639,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 639,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 25,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 639,
+  "offerClosingFee" : 88,
+  "acceptFundingFee" : 651,
+  "acceptClosingFee" : 85
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 35,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 34,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 651,
+  "offerClosingFee" : 98,
+  "acceptFundingFee" : 651,
+  "acceptClosingFee" : 97
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 71,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 25,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 639,
+  "offerClosingFee" : 134,
+  "acceptFundingFee" : 651,
+  "acceptClosingFee" : 88
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 22,
+    "offerChangeSPKLen" : 34,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 71,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 10
+  },
+  "offerFundingFee" : 6510,
+  "offerClosingFee" : 850,
+  "acceptFundingFee" : 6510,
+  "acceptClosingFee" : 1340
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 22,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 5
+  },
+  "offerFundingFee" : 3195,
+  "offerClosingFee" : 1180,
+  "acceptFundingFee" : 3255,
+  "acceptClosingFee" : 425
+}, {
+  "inputs" : {
+    "offerInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "offerPayoutSPKLen" : 173,
+    "offerChangeSPKLen" : 22,
+    "acceptInputs" : [ {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 0,
+      "maxWitnessLen" : 218
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 108
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 133
+    }, {
+      "redeemScriptLen" : 34,
+      "maxWitnessLen" : 218
+    } ],
+    "acceptPayoutSPKLen" : 35,
+    "acceptChangeSPKLen" : 34,
+    "feeRate" : 1
+  },
+  "offerFundingFee" : 639,
+  "offerClosingFee" : 236,
+  "acceptFundingFee" : 651,
+  "acceptClosingFee" : 98
+} ]
\ No newline at end of file
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test_scripts.json b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test_scripts.json
new file mode 100644
index 0000000000..6b478af676
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_fee_test_scripts.json
@@ -0,0 +1,45 @@
+[ {
+  "byteLen" : 0,
+  "script" : "",
+  "description" : "empty"
+}, {
+  "byteLen" : 22,
+  "script" : "00146f47307cd1d7e61b89a6fe24e660714d31e4aca6",
+  "description" : "p2wpkh spk"
+}, {
+  "byteLen" : 25,
+  "script" : "76a914a5745456754abf104d8d1a8852f9ef4cbb0af3ee88ac",
+  "description" : "p2pkh spk"
+}, {
+  "byteLen" : 34,
+  "script" : "0020e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+  "description" : "p2wsh spk"
+}, {
+  "byteLen" : 35,
+  "script" : "21022a5c418a642d70ab3f21029f510931a5af44617d58fcc50195acc136ec90b75cac",
+  "description" : "p2pk spk"
+}, {
+  "byteLen" : 71,
+  "script" : "522102a48558c126c5e3eda2188e743ab31cf9b3e956bb5cc6b9a9eeceb17c69ccffc42103f9be793aa26af2acb555ced3702e360e3c65b8c040c0fc0cf85844bce904cf7452ae",
+  "description" : "2-of-2 multisig spk"
+}, {
+  "byteLen" : 173,
+  "script" : "532103828103a5eb0a8663fffd122ccc52ab7705197686cb09abc8a3d25bdae7426a7a2102fdfc0fbf0148587cb076bbeea390fad9f110ef4b5f5c916b68f0b846ccd8892d2102ab454385715ca02c7cc3aad97b202fd84375906612798b88d386e1c9a7e5bb5421020af3417e4c0a9ddd5a0adbbf460ca05301a9a13d61dcd7ac8bf43b49f06d4d2c21034f5385fdeaaaa725231983765e7fe4c1dbab5c54c051b02b1d4b68c57b8eb67555ae",
+  "description" : "3-of-5 multisig spk"
+}, {
+  "byteLen" : 107,
+  "script" : "02473045022100dc049370a3e1e2f1c30976f97b503ce00e840b10603cf7da86cbbb7a3362501302206104618664922452bfbf40951deb1cccba49f659e3a082761e360d1e1f6abff921029a5276b84f01538373a67033942bb9c4078d8ee2cb72b6dd148fc25e075109cf",
+  "description" : "p2wpkh (low R) witness"
+}, {
+  "byteLen" : 108,
+  "script" : "024830460221009efb9e799b6ddbad4040bf6ae214e3320064e68ccba81dc5a19c516eb0cb8148022100dc049370a3e1e2f1c30976f97b503ce00e840b10603cf7da86cbbb7a336250132103b000bc3cae94b64f26375a8f5d5700f320beeeeb19f82cbb1494cd22f9bf6325",
+  "description" : "p2wpkh (high R) witness"
+}, {
+  "byteLen" : 133,
+  "script" : "03473045022100dc049370a3e1e2f1c30976f97b503ce00e840b10603cf7da86cbbb7a3362501302206104618664922452bfbf40951deb1cccba49f659e3a082761e360d1e1f6abff92102d96d94954612b0ca242247baa8f09ebc4a98f9d4fe335e1b2d1efcecc4ec2f351976a9141969d7b6c106a848d1330652290cd128705d28da88ac",
+  "description" : "p2wsh(p2pkh) witness"
+}, {
+  "byteLen" : 218,
+  "script" : "0400473045022100dc049370a3e1e2f1c30976f97b503ce00e840b10603cf7da86cbbb7a3362501302206104618664922452bfbf40951deb1cccba49f659e3a082761e360d1e1f6abff94730450221009efb9e799b6ddbad4040bf6ae214e3320064e68ccba81dc5a19c516eb0cb8148022023fb6c8f5c1e1d0e3cf6890684afc31eac2ad1d64f0ba8613906a3129cd3f12e47522102a48558c126c5e3eda2188e743ab31cf9b3e956bb5cc6b9a9eeceb17c69ccffc42103f9be793aa26af2acb555ced3702e360e3c65b8c040c0fc0cf85844bce904cf7452ae",
+  "description" : "p2wsh(2-of-2 multsig) witness"
+} ]
\ No newline at end of file
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_message_test.json b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_message_test.json
new file mode 100644
index 0000000000..79b0594305
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_message_test.json
@@ -0,0 +1,124 @@
+[ {
+  "tpeName" : "contract_info_v0",
+  "input" : "fda71055133132313134373033383237313332333337363600000000060ef950142d35363531383531393237393637343536383538000000000bebc20013383138393936393137343533303334303738300000000000000000",
+  "fields" : {
+    "tpe" : "fda710",
+    "length" : "55",
+    "outcomes" : [ {
+      "outcome" : "3dfeb356412d78912b58e37a2c195c807bb400203597d53f6287df741aa6d4c0",
+      "localPayout" : "00000000060ef950"
+    }, {
+      "outcome" : "0c57d8013614d9252c6c194ade3c93c16804e43757461f0091ddb6d879fe7176",
+      "localPayout" : "000000000bebc200"
+    }, {
+      "outcome" : "b9a960c1a908078a3822db4ea912185904bc9c6dcda04e2de6d01489f0b0dc1a",
+      "localPayout" : "0000000000000000"
+    } ]
+  }
+}, {
+  "tpeName" : "oracle_info_v0",
+  "input" : "fda71240c59730cfae37472dc50a08e4d2804a57dd1506be6b0aafaa3728673f79183a9f737f4c83ba94f58dc605307dfb8a94f26e5a98121e6f6b05947e187b66c6b6b6",
+  "fields" : {
+    "tpe" : "fda712",
+    "length" : "40",
+    "pubKey" : "c59730cfae37472dc50a08e4d2804a57dd1506be6b0aafaa3728673f79183a9f",
+    "rValue" : "737f4c83ba94f58dc605307dfb8a94f26e5a98121e6f6b05947e187b66c6b6b6"
+  }
+}, {
+  "tpeName" : "funding_input_v0",
+  "input" : "fda71437002902000000000100c2eb0b00000000160014aaa42dcd06d4e6a5a05f3d9eb561f73dc86edd1d0000000000000000ffffffff006b0000",
+  "fields" : {
+    "tpe" : "fda714",
+    "length" : "37",
+    "prevTxLen" : "0029",
+    "prevTx" : "02000000000100c2eb0b00000000160014aaa42dcd06d4e6a5a05f3d9eb561f73dc86edd1d00000000",
+    "prevTxVout" : "00000000",
+    "sequence" : "ffffffff",
+    "maxWitnessLen" : "006b",
+    "redeemScriptLen" : "0000",
+    "redeemScript" : ""
+  }
+}, {
+  "tpeName" : "cet_adaptor_signatures_v0",
+  "input" : "fda716fd01e6004a7265e664e6c8b3511e2abeb9701e2ad5ac0fcd5669060dfabab493b2bcb04156e26fb3eb66afa4190c9feb99d248560bb5b8ced8c51643e35fcc8b1045097c01daefe8add5430e7b57d275c9b4cd18423d64226fd8f3f66a95e56e664d2ca8fb8dad3a5a231418cbf59650958551e02b599a6ab69b669055f1d1412f2dec44d0cdf6ff4eb48cad1eb04d647364038a87a3fba1a5814644ab9dcc2a9ad3b1c5ac0053fdc89d260f8935f3658d5444084d13e479e958353338bbfcdd35f8c49c0c8dffc56fde0a6b3d18067750e155341e3a9245524dd9c1498e08358fb354ae6c53015a9d0801dcdc5a69a78426763b88fc015f28459db3acb7ce60e3409aca8248cd2d6934cd64e9d1b4bc8a619f2f3781858c0d25e0663a25df00d526c4ef06388dbbd104b5b1514fe90d81ac3ff65a8f7cd2d3b4e0fb13477bcd074414985c1d6a001520cf43dc1b4c04f472c14dd6fd19ad3e57abd671a3fd7f6ceaabfc0227f31c5a14dcfbfd248d409af7077ab0b303875fcb4fc2789a5d06f379241c932b5e7501eca7f50ea45fe68301085a2ed27aad9979fb92dff666f4e6b2a9547080f643763a516e5904b86b828dec6ca860ea956acd70fb8f99e1ec3af83887123b679a8e95e9f64bfb5c4800f563efb82fcdedeeb0841e58d4860a96460da99d6ffbfb97",
+  "fields" : {
+    "tpe" : "fda716",
+    "length" : "fd01e6",
+    "sigs" : [ {
+      "encryptedSig" : "004a7265e664e6c8b3511e2abeb9701e2ad5ac0fcd5669060dfabab493b2bcb04156e26fb3eb66afa4190c9feb99d248560bb5b8ced8c51643e35fcc8b1045097c",
+      "dleqProof" : "01daefe8add5430e7b57d275c9b4cd18423d64226fd8f3f66a95e56e664d2ca8fb8dad3a5a231418cbf59650958551e02b599a6ab69b669055f1d1412f2dec44d0cdf6ff4eb48cad1eb04d647364038a87a3fba1a5814644ab9dcc2a9ad3b1c5ac"
+    }, {
+      "encryptedSig" : "0053fdc89d260f8935f3658d5444084d13e479e958353338bbfcdd35f8c49c0c8dffc56fde0a6b3d18067750e155341e3a9245524dd9c1498e08358fb354ae6c53",
+      "dleqProof" : "015a9d0801dcdc5a69a78426763b88fc015f28459db3acb7ce60e3409aca8248cd2d6934cd64e9d1b4bc8a619f2f3781858c0d25e0663a25df00d526c4ef06388dbbd104b5b1514fe90d81ac3ff65a8f7cd2d3b4e0fb13477bcd074414985c1d6a"
+    }, {
+      "encryptedSig" : "001520cf43dc1b4c04f472c14dd6fd19ad3e57abd671a3fd7f6ceaabfc0227f31c5a14dcfbfd248d409af7077ab0b303875fcb4fc2789a5d06f379241c932b5e75",
+      "dleqProof" : "01eca7f50ea45fe68301085a2ed27aad9979fb92dff666f4e6b2a9547080f643763a516e5904b86b828dec6ca860ea956acd70fb8f99e1ec3af83887123b679a8e95e9f64bfb5c4800f563efb82fcdedeeb0841e58d4860a96460da99d6ffbfb97"
+    } ]
+  }
+}, {
+  "tpeName" : "funding_signatures_v0",
+  "input" : "fda718710001000200483045022078b7589954b3fa6131629827f14284727f743ad788364766ca58b4c38aa89e4d022100e298f649009182b4421a19019c52c559427344ad9bf57a0baa0997579d98279d010021020101a1b3fd70748dea06df8005b6de26b298e516e2ffa561745cf300747f92ca",
+  "fields" : {
+    "tpe" : "fda718",
+    "length" : "71",
+    "numWitnesses" : "0001",
+    "witnesses" : [ {
+      "stackLen" : "0002",
+      "stack" : [ {
+        "stackElementLen" : "0048",
+        "stackElement" : "3045022078b7589954b3fa6131629827f14284727f743ad788364766ca58b4c38aa89e4d022100e298f649009182b4421a19019c52c559427344ad9bf57a0baa0997579d98279d01"
+      }, {
+        "stackElementLen" : "0021",
+        "stackElement" : "020101a1b3fd70748dea06df8005b6de26b298e516e2ffa561745cf300747f92ca"
+      } ]
+    } ]
+  }
+}, {
+  "tpeName" : "offer_dlc_v0",
+  "input" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71057142d31393234383830323932373336303236323438000000000bebc200142d343839363234313333323636303437363633360000000000000000142d313234333930313230313134383130393638360000000002852271fda71240158da3789a8ff6d08e8e643626f9dd725d86ccac99bcd2dc71f4aea3f8dcd95073b57cddccb0f8514adbe3ff9b54a6a1edb4bd6a60dd7c7be57958348d4d6176031f1b96f96e86a14473ff71c3f9cb1d0f4dd5c007f45f55464d6a666a33117ea5001600143191cecb4b5fce7849f4e511f164285cefaeb3550000000005f5e1000001fda71437002902000000000100c2eb0b00000000160014f0507a3f11e5691b9c718a257ed5868d052759440000000000000000ffffffff006b000000160014878b745749da0bb3be65d98ce8615de0cbc6cd9d000000000000000100000064000000c8",
+  "fields" : {
+    "tpe" : "a71a",
+    "contractFlags" : "00",
+    "chainHash" : "06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f",
+    "contractInfo" : "fda71057142d31393234383830323932373336303236323438000000000bebc200142d343839363234313333323636303437363633360000000000000000142d313234333930313230313134383130393638360000000002852271",
+    "oracleInfo" : "fda71240158da3789a8ff6d08e8e643626f9dd725d86ccac99bcd2dc71f4aea3f8dcd95073b57cddccb0f8514adbe3ff9b54a6a1edb4bd6a60dd7c7be57958348d4d6176",
+    "fundingPubKey" : "031f1b96f96e86a14473ff71c3f9cb1d0f4dd5c007f45f55464d6a666a33117ea5",
+    "payoutSPKLen" : "0016",
+    "payoutSPK" : "00143191cecb4b5fce7849f4e511f164285cefaeb355",
+    "totalCollateralSatoshis" : "0000000005f5e100",
+    "fundingInputsLen" : "0001",
+    "fundingInputs" : [ "fda71437002902000000000100c2eb0b00000000160014f0507a3f11e5691b9c718a257ed5868d052759440000000000000000ffffffff006b0000" ],
+    "changeSPKLen" : "0016",
+    "changeSPK" : "0014878b745749da0bb3be65d98ce8615de0cbc6cd9d",
+    "feeRate" : "0000000000000001",
+    "contractMaturityBound" : "00000064",
+    "contractTimeout" : "000000c8"
+  }
+}, {
+  "tpeName" : "accept_dlc_v0",
+  "input" : "a71c31fcbdd62eebf5b120b404e1a2ce06f8145301cc8d0217bd60cf58d18c6af10e0000000005f5e10002674c81da205b2a5c610f169858894388a98ce7dc3584e7b5136459ba946fd35100160014ff3c1088156462dad4fcd8fac9391036da82ec7b0001fda71437002902000000000100c2eb0b000000001600141e24a1b77e4ad65b2ea3297eace4a9c7e33409680000000000000000ffffffff006b000000160014567eb85ad8dd5bf69404e0d2398c0b205ece8072fda716fd01e6011b888867c15b9cdcd79d3c2f6dc9dc726496c67d2e69ac7de17fd0a65c6bbd778db8219b43535e90e7d4366398ad6f0bd6bc878caefbc5e59a96fae0fdfc24d8013ef3096baec015a9d878108173425e781f1a294ee2021c107da320352fb7c501d650725df33dbecac781322f5d4d7f4ffe73addb066bf632e174dc6df05adb3f32ae91b17695dc3093df654ebfc92b082919078e4b400f188141b8317957bff00070d23d6981cdc49eee7505c9521d496fc497de767064c1037712a8aa0977832377aaa26280842b9439adfdcb92c8a340841d307e2f25e67b28c678c916b37236007397c6b88f211ff3031f390540bf3d8d6d35b17e8af8d1d7d88a6d9f26533e0a891fa2593853b93d8ef483b53a16fd7039baabde9e9d17b0e5e1a67e2b634ec3833c2db0b847d1d2380b5edff29d51e7f0110ba3898a3500deab034a3769b78e01d212099997a1f1e3eed594bf9d6b5b6ed530c7269cd32ee86aba7c500a26f8d5ffefa35740054a9c9df4338d305b381c2d799cd140f99280ae85eed645e724a90164d049c1b580251f4112723f182a51d9ae66253d6b0b0b2ddbf2800e955ec125012d6656da15748bcb6080e8b90e668a5248357a3f047e29dbafe655ba9a952ed74b150cd252e3fb5a9a030400d139f3c50ccf5fbd0539e6234643feece4ee46a5d47dca0370c39f94e43782ee38994689507b90f84340582445ab7a4459afb5ccdfaf1bc57bfa938413228cc276280e76bfdbb7261b33e1b8b6243768877849",
+  "fields" : {
+    "tpe" : "a71c",
+    "tempContractId" : "31fcbdd62eebf5b120b404e1a2ce06f8145301cc8d0217bd60cf58d18c6af10e",
+    "totalCollateralSatoshis" : "0000000005f5e100",
+    "fundingPubKey" : "02674c81da205b2a5c610f169858894388a98ce7dc3584e7b5136459ba946fd351",
+    "payoutSPKLen" : "0016",
+    "payoutSPK" : "0014ff3c1088156462dad4fcd8fac9391036da82ec7b",
+    "fundingInputsLen" : "0001",
+    "fundingInputs" : [ "fda71437002902000000000100c2eb0b000000001600141e24a1b77e4ad65b2ea3297eace4a9c7e33409680000000000000000ffffffff006b0000" ],
+    "changeSPKLen" : "0016",
+    "changeSPK" : "0014567eb85ad8dd5bf69404e0d2398c0b205ece8072",
+    "cetSignatures" : "fda716fd01e6011b888867c15b9cdcd79d3c2f6dc9dc726496c67d2e69ac7de17fd0a65c6bbd778db8219b43535e90e7d4366398ad6f0bd6bc878caefbc5e59a96fae0fdfc24d8013ef3096baec015a9d878108173425e781f1a294ee2021c107da320352fb7c501d650725df33dbecac781322f5d4d7f4ffe73addb066bf632e174dc6df05adb3f32ae91b17695dc3093df654ebfc92b082919078e4b400f188141b8317957bff00070d23d6981cdc49eee7505c9521d496fc497de767064c1037712a8aa0977832377aaa26280842b9439adfdcb92c8a340841d307e2f25e67b28c678c916b37236007397c6b88f211ff3031f390540bf3d8d6d35b17e8af8d1d7d88a6d9f26533e0a891fa2593853b93d8ef483b53a16fd7039baabde9e9d17b0e5e1a67e2b634ec3833c2db0b847d1d2380b5edff29d51e7f0110ba3898a3500deab034a3769b78e01d212099997a1f1e3eed594bf9d6b5b6ed530c7269cd32ee86aba7c500a26f8d5ffefa35740054a9c9df4338d305b381c2d799cd140f99280ae85eed645e724a90164d049c1b580251f4112723f182a51d9ae66253d6b0b0b2ddbf2800e955ec125012d6656da15748bcb6080e8b90e668a5248357a3f047e29dbafe655ba9a952ed74b150cd252e3fb5a9a030400d139f3c50ccf5fbd0539e6234643feece4ee46",
+    "refundSignature" : "a5d47dca0370c39f94e43782ee38994689507b90f84340582445ab7a4459afb5ccdfaf1bc57bfa938413228cc276280e76bfdbb7261b33e1b8b6243768877849"
+  }
+}, {
+  "tpeName" : "sign_dlc_v0",
+  "input" : "a71efee82c5d269c4b0788e3e4649c4ede28575ee423681d3665fb85298bc55aedbcfda716fd01e60052bb42a1d5d068708bbdc8b8879c40337dc05561b4434b4983c11aae69906b4ae81ac36d8d6fd358a414beb767bd5c23d75817d2d9bba4cfd9ddc737fd427c8901ddb650e20332551b5903655c17f4dbf93a123997935d5a5f8f761892a917fe691d891ee5d209bbc6f9d82af5f14db9ee23ee70096c02865adad7e5fa06345f00739389cc3079f559e724c60b81203ba42551b687a0516c2034bc1929ce7daa0100d452b9afbb3e5956668ee5e56163994227b5d503de16083d2f7499bcbf15e461e9dd76a0efbe263f7e1756625a016be03afaf692da734894e0e10e7c069427d1017e6bf2aee98c9be40e7509fc33471f2ad4519086644d09300c5d54660d64832e1e9aeb747fad999ade748edaba68de873252779e29f390c90cc8cd2ad52ec545e6ec7dd92324daf17577a1e3ed2ca0145db7a3c4f45a85724f5a5a1541b1a0fb0163a32cf351d480dc67886e084b4fb6dad2aea26f467c7362018adc0884999de4a806af353f53ccaaa488985aaad4f8b93d31b7f692e9c68e8e8b1c31a5755393004d602f85b139bca252092d08b855b89925056361e9d6828e9910522daa5e6ba74ac6eaa5b28eb7764fc76c0bbfa6635059ce955e55e4991b932b8bdf8748d1f0655898afe4e603e0ca147ff6c7f597e18b7c30e567383cc7265f2ecccce15775ab115bb73f8bb53642da6230b0426853ac837e4e090a244ac329c1743fd8974aa87f33cc5be7340fed5bf026684cb7eb72a86128ea01b5d91257bce3e9a9d434fda718720001000200493046022100f3eb25691ac6c2c993d52e775f43259dd9bc0565edff45fcf70f268d73bf69ae022100dadadb0eff6e32ccecee60fec37b22ace543c0a5251dcdd30d744622c64904fa01002102e6f5c02b455c541a098d3043ff0f744c5a71a298884f82155805f8558673fc52",
+  "fields" : {
+    "tpe" : "a71e",
+    "contractId" : "fee82c5d269c4b0788e3e4649c4ede28575ee423681d3665fb85298bc55aedbc",
+    "cetSignatures" : "fda716fd01e60052bb42a1d5d068708bbdc8b8879c40337dc05561b4434b4983c11aae69906b4ae81ac36d8d6fd358a414beb767bd5c23d75817d2d9bba4cfd9ddc737fd427c8901ddb650e20332551b5903655c17f4dbf93a123997935d5a5f8f761892a917fe691d891ee5d209bbc6f9d82af5f14db9ee23ee70096c02865adad7e5fa06345f00739389cc3079f559e724c60b81203ba42551b687a0516c2034bc1929ce7daa0100d452b9afbb3e5956668ee5e56163994227b5d503de16083d2f7499bcbf15e461e9dd76a0efbe263f7e1756625a016be03afaf692da734894e0e10e7c069427d1017e6bf2aee98c9be40e7509fc33471f2ad4519086644d09300c5d54660d64832e1e9aeb747fad999ade748edaba68de873252779e29f390c90cc8cd2ad52ec545e6ec7dd92324daf17577a1e3ed2ca0145db7a3c4f45a85724f5a5a1541b1a0fb0163a32cf351d480dc67886e084b4fb6dad2aea26f467c7362018adc0884999de4a806af353f53ccaaa488985aaad4f8b93d31b7f692e9c68e8e8b1c31a5755393004d602f85b139bca252092d08b855b89925056361e9d6828e9910522daa5e6ba74ac6eaa5b28eb7764fc76c0bbfa6635059ce955e55e4991b932b8bdf8748d1f0655898afe4e603e0ca147ff6c7f597e18b7c30e567383cc7265f2ecccce15775",
+    "refundSignature" : "ab115bb73f8bb53642da6230b0426853ac837e4e090a244ac329c1743fd8974aa87f33cc5be7340fed5bf026684cb7eb72a86128ea01b5d91257bce3e9a9d434",
+    "fundingSignatures" : "fda718720001000200493046022100f3eb25691ac6c2c993d52e775f43259dd9bc0565edff45fcf70f268d73bf69ae022100dadadb0eff6e32ccecee60fec37b22ace543c0a5251dcdd30d744622c64904fa01002102e6f5c02b455c541a098d3043ff0f744c5a71a298884f82155805f8558673fc52"
+  }
+} ]
\ No newline at end of file
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_schnorr_test.json b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_schnorr_test.json
new file mode 100644
index 0000000000..558ea21184
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_schnorr_test.json
@@ -0,0 +1,51 @@
+[ {
+  "inputs" : {
+    "privKey" : "5376a94490ff9b07387511351fdf9fb56d0f704effaa9e55218ac82f712f8a26",
+    "privNonce" : "f32827363379a82bedd1724197ebbae0b0e58719d3014dacc353f0c45109830e",
+    "msgHash" : "b27019d1912cb97b679eee4c01f9203e00da8443767173df076a529a66e707cf"
+  },
+  "pubKey" : "ce9a3088688eecd98db77c90637c25e6801fc56b0436e7e0103cee82ec63d508",
+  "pubNonce" : "0273ebfee82296afd16b9a6c7cf2485ef83b0cba1b6b66dc7edfbfb1071e8317",
+  "signature" : "0273ebfee82296afd16b9a6c7cf2485ef83b0cba1b6b66dc7edfbfb1071e8317ee2b16e43e08393bcbe087c792b30c902ff136775323877fc832f64bf5935781",
+  "sigPoint" : "020dddc643adbc3c8d745f6e9c028bf4abf22cfc97568b60e4c3419cbb72502690"
+}, {
+  "inputs" : {
+    "privKey" : "b339569c68f2de370ba4774203c2d01cfbe2af1a23958accaaa227e64cae4e5f",
+    "privNonce" : "467a0383c6116b9c65ddc8aa2d3577a0f597027b07163f5ea9e891d068c9545a",
+    "msgHash" : "ecc549855e17ce7dbce3759ff9ffd224ba34e40befe3df69d6b7a5450c82fc07"
+  },
+  "pubKey" : "639fd0e002f476a1ba3dd3bb40d007544cf9e09ff1a23bd8c66d1cb8980fed8c",
+  "pubNonce" : "1e90814df446c16b854494aac8b1f05771611228b52ddd6b1eb1dd29dab973b7",
+  "signature" : "1e90814df446c16b854494aac8b1f05771611228b52ddd6b1eb1dd29dab973b7cfadd5b1004918214713cc052b84821f675eccd12388008b25dc18b6596aa132",
+  "sigPoint" : "02987faf504b29c90ffa0e83f9c9c9919d7c56ad5564c0b7eaa63d92b7cf3e51ca"
+}, {
+  "inputs" : {
+    "privKey" : "a6080050e59f3b7ebbd14a3d058f44978ece37bb896543c789b89ca86dabc74d",
+    "privNonce" : "84e9e4edfcd67a92f326f4d96f48d311793e96c2b542e96e5738fe987820d5e4",
+    "msgHash" : "6744b92461c47f4a7f7b785c6bb38daa40b7c1d9e532b5480e5b73c6c0096011"
+  },
+  "pubKey" : "4c2a9fd1473302f23d28c398d54e4bef5f3d6d01341387bac5872796b89a0ef9",
+  "pubNonce" : "7fa3a59374116c93b1ea0d2c9408b40768e99e43562f9bd7205986e567e961b5",
+  "signature" : "7fa3a59374116c93b1ea0d2c9408b40768e99e43562f9bd7205986e567e961b59dd00ba70a497851153afc5faf774f8ed3f8b6b2b421c94121f7c85dab3d6225",
+  "sigPoint" : "03b6e6aee8ef20a761bc9bbb227d0a49c1eea80a0e6df62a79c576b5f08ad88ec5"
+}, {
+  "inputs" : {
+    "privKey" : "cfe7c7ed47b0ce4885838a53cb6b102ae09b37b2705147607d886e62988190be",
+    "privNonce" : "a0d084b608e5d1b218901212ed3fa15a8692de99c37c6cae6648285156a5feda",
+    "msgHash" : "143bc33b165b4f7e66a2d997e1f20e4d880416be6d7aaa0d8d385d1ab9482470"
+  },
+  "pubKey" : "43766d34751895463a0a9a3979b8ebc300132c3117ef20de0a209ffc1e5d06cb",
+  "pubNonce" : "53c53d2f7eae94c4766ec322c018be27f65fb65478212f4983b08b8f40765018",
+  "signature" : "53c53d2f7eae94c4766ec322c018be27f65fb65478212f4983b08b8f407650188a01c30884bcd27157191fa4046944c6fc035a69765fd09dccd7a02816143a84",
+  "sigPoint" : "035041aedc6a8fb0c911507af5cdfe5393761361a28e88d5f4f4197f39a495b6ab"
+}, {
+  "inputs" : {
+    "privKey" : "7582012d1fa17f723754927109828c71c5d7dd3fadcc8f20d6a79dde27fc985f",
+    "privNonce" : "dd1d13c185e27172e83fd615f6ace25b89e7360ca74888b15b7ac4b639d9edb8",
+    "msgHash" : "1c2aedbbbd3d8a425fc688730a00c8da2e5b0f0be90eee1f90a2099cac5edb50"
+  },
+  "pubKey" : "d0816bd521ce59ae060eb43cd6e8d0fc8047f338a23f0038a986b92f77a038fe",
+  "pubNonce" : "dae00f16a8c375fb8f0848e96ddfb77ea57b2c6c6f499ffbe6534ba53d6193ae",
+  "signature" : "dae00f16a8c375fb8f0848e96ddfb77ea57b2c6c6f499ffbe6534ba53d6193aef8c6936867b1addd66517eaf933e92fb5f6299975ffcf09901439a012ad2ad83",
+  "sigPoint" : "020ddbf600b1cef6cb9f9cdabdb1951c42f1a6b7fa7dee0ef9fb3bdda258e5b2c6"
+} ]
\ No newline at end of file
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_test.json b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_test.json
new file mode 100644
index 0000000000..f0be2c381e
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_test.json
@@ -0,0 +1,1996 @@
+[ {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "e963d5daf2ca5c8fd98f0880cf91934746707386f98e7c2572a6a7b2d0c4b910",
+        "nonce" : "688aab588f33e49e0b314de747572e9a1e9d95bf1a76e857831736cfb656cd6e"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-6844868641218943592",
+        "outcome" : "3fc6cfeb06043616bb3ca43b736a984f2648e13fbc3347ea66b07cf60eac7b33",
+        "localPayout" : 0
+      }, {
+        "preImage" : "5985112471759836412",
+        "outcome" : "6be88ac351383c2b17839cf535c95139b07edb6f04bfafa88a5e62cbafacb5b0",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "6be88ac351383c2b17839cf535c95139b07edb6f04bfafa88a5e62cbafacb5b0",
+      "oracleSignature" : "688aab588f33e49e0b314de747572e9a1e9d95bf1a76e857831736cfb656cd6e54715302775c9f80a361b6d039cb222da6c5977b2cd74b5de93754877d368063"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143c28627ff9e4bbba68939bf1f1f6fb3f75cf9d0700000000",
+        "idx" : 0,
+        "inputKeys" : [ "3d246c112ea06505341968f2f78819663119ca376db6d21435464fc44770ad5f" ],
+        "scriptWitness" : "020021021ceceb29d4ca29ab421af97f47b517a34c4e85b9be48d920bbc7f086868da7e0",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q4kct9run8dvqs9dds5l20uydtynmdspzkgq2gw",
+      "fundingPrivKey" : "3c2f41c08e1f469d8ee0c62bcb59a9f94f5382464fd8a3fb548c9f080939c3a0",
+      "payoutAddress" : "bcrt1qmns98nclhx2fsuwgq3rt03d0vcj6wdxf5xf6g4"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fd793fe7220125de139111d44b4765db40ee6fca00000000",
+        "idx" : 0,
+        "inputKeys" : [ "6b47b73c416643025168dc204c2a7af0de39662823a62466d53ae661293b297b" ],
+        "scriptWitness" : "020021031f5d9b38e052267ba0ca19acbdc527f763dc494a1f37d4f123f51a2dc6ed210c",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qky66ct6rrqf3n2r9sz4x23zygdfykrxt4kt5ut",
+      "fundingPrivKey" : "11d4c791ad9249b89e446b409e06e4d9140013893b94091cc5a1bb4190465a6c",
+      "payoutAddress" : "bcrt1ql5mgpxvd4adtwjlqt4sw2l92xy4hpdv4r7ukx8"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71039142d3638343438363836343132313839343335393200000000000000001335393835313132343731373539383336343132000000000bebc200fda71240e963d5daf2ca5c8fd98f0880cf91934746707386f98e7c2572a6a7b2d0c4b910688aab588f33e49e0b314de747572e9a1e9d95bf1a76e857831736cfb656cd6e02102ac063486f0ae79be8546b474876a7a95644720b0868c672283b29278fda7000160014dce053cf1fb9949871c80446b7c5af6625a734c90000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143c28627ff9e4bbba68939bf1f1f6fb3f75cf9d070000000000000000ffffffff006b000000160014adb0b28f933b580815ad853ea7f08d5927b6c022000000000000000500000064000000c8",
+  "accept" : "a71cb48c60f5edefd938082b13599dd08658262533f4267c1dff9cd3fbbce74c65cc0000000005f5e1000352140f8407a101cf16c639383a86eda01802f47869e0a8bafe1792e084a22a8700160014fd3680998daf5ab74be05d60e57caa312b70b5950001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fd793fe7220125de139111d44b4765db40ee6fca0000000000000000ffffffff006b000000160014b135ac2f43181319a86580aa65444443524b0ccbfda716fd014401db0927f67827969ea4e4a81f280264ba2744ba1579c856f09df32365624745b4ff4aeffe7646ecd6e41ad731ab81607be54feb2dc534ab7a0172731348f663f601690c56875cc5fe928c5dea1e8f12a56140a544fdf9157e7de862b6c32155b44423c14e7916c5ae51651841e9bd1f987be133ea852b1207e77238b4f9a867c3361ea5eaf23aad04ce1ec3471abc3e83246a77ca187f71b1a48d9f739df158d157016e370f657974a04a51fd219b019396cf7aba02e3fb25061d7859baaf74215154311413397aafccf4cc039c2d72f73b83cd88ea8582224cef301b585479c076f800bb962745ba3fdc0b58014436500e7ef8deaf142e9a5dbcf0bb18d8125d2a7be6adeb85031d1728a9b832441e881072578d5bf915b95b877f595e3ba657ed1f44c7614b3d4f4e9e5f037ad16014951db7dc98c545db92da8282051f5a16bf5ba018fb03e5809df04db5f0cb56d49f1fbc0f9bd7b9ef1485e30d927ad89b61d9137e57841309ff6bb7f272a24022210b7e9838a277d068e56fa69245034255c8f2",
+  "sign" : "a71e21b6c15a8fb2a210dbc2f282538c6a2f99416bbf3062ea5a27e8664cb639e1a2fda716fd0144007f6c506fb1f83920dafd77522b846cc0c8494d461362203060de35d2cbaf3e203265457829f29a02589db0065da901e76b87d819f7a4852bdef46f8ae9e7f0bf000422146896ae7d0cd7527470928ce3a389f61f3127b06722260384c320c06e15a5aed132a14956481f457d6447390c00b07b61f6ce768142db700aaf3540e3aba364be233998b181eac5973824cc5286e102e6fa55cdce0056f16f66fffb57e60140d8d9a2264b2f1fc3c32d4ad82c3d0ffb48b66aa15f15b3e8570beee8fb8ed160727aa81f1ce5991f3643d4c609a6dbc14d8efbb9f6ca4f8b8f9e4b6f1d4549002efda0ffbdc6bf4f0ba5b08e09a4d3ccafeef1574a4b927acca79167be60ebd83a0f1d5ff1ebdba7881738c7bf6532def04bcf488ff3984794dcd6cbaecb7a002a441c25113976b8d8888db89fb76ae3ad13033f99a217773cee24236cd973673fd7d522dabf511ce1fd2967003c10ede4b36c67b25be61c0caedea74a80e8410e745f78ac60ff27a44b5612f181f70e260260b2d3c269b9701409b227df1043fda718700001000200473044022066f0c1760a1431281a29cd3b43c11c0fffceae18cc4af8e66a46fee3ce687826022054ed9f918cac3128791baa5cdd4f4e7a5430b4e3216bc704350a2c949249b493010021021ceceb29d4ca29ab421af97f47b517a34c4e85b9be48d920bbc7f086868da7e0",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000002a396a541e5b3a89bf73b3c07b71ca75c1799af3245f9226086ab5d7324ab4d1a0000000000ffffffff324435c95904547864932c04df8c52dd2f66e2ac8974ba425d72ae25f81a43710000000000ffffffff0352c5eb0b00000000220020a69e636a7a6246c1b4fb8f2568f18120cb4d1e80d861d81970996c9883742a75e1dcf50500000000160014adb0b28f933b580815ad853ea7f08d5927b6c022e1dcf50500000000160014b135ac2f43181319a86580aa65444443524b0ccb00000000",
+    "cets" : [ "020000000001016e847551f09d3bbba5f71e164b5864bf77ec5ccedbe1e9d3287b5d62afa13a950000000000feffffff0100c2eb0b00000000160014fd3680998daf5ab74be05d60e57caa312b70b5950147522102102ac063486f0ae79be8546b474876a7a95644720b0868c672283b29278fda70210352140f8407a101cf16c639383a86eda01802f47869e0a8bafe1792e084a22a8752ae64000000", "020000000001016e847551f09d3bbba5f71e164b5864bf77ec5ccedbe1e9d3287b5d62afa13a950000000000feffffff0100c2eb0b00000000160014dce053cf1fb9949871c80446b7c5af6625a734c90147522102102ac063486f0ae79be8546b474876a7a95644720b0868c672283b29278fda70210352140f8407a101cf16c639383a86eda01802f47869e0a8bafe1792e084a22a8752ae64000000" ],
+    "refundTx" : "020000000001016e847551f09d3bbba5f71e164b5864bf77ec5ccedbe1e9d3287b5d62afa13a950000000000feffffff0200e1f50500000000160014dce053cf1fb9949871c80446b7c5af6625a734c900e1f50500000000160014fd3680998daf5ab74be05d60e57caa312b70b5950147522102102ac063486f0ae79be8546b474876a7a95644720b0868c672283b29278fda70210352140f8407a101cf16c639383a86eda01802f47869e0a8bafe1792e084a22a8752aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000102a396a541e5b3a89bf73b3c07b71ca75c1799af3245f9226086ab5d7324ab4d1a0000000000ffffffff324435c95904547864932c04df8c52dd2f66e2ac8974ba425d72ae25f81a43710000000000ffffffff0352c5eb0b00000000220020a69e636a7a6246c1b4fb8f2568f18120cb4d1e80d861d81970996c9883742a75e1dcf50500000000160014adb0b28f933b580815ad853ea7f08d5927b6c022e1dcf50500000000160014b135ac2f43181319a86580aa65444443524b0ccb02473044022066f0c1760a1431281a29cd3b43c11c0fffceae18cc4af8e66a46fee3ce687826022054ed9f918cac3128791baa5cdd4f4e7a5430b4e3216bc704350a2c949249b4930121021ceceb29d4ca29ab421af97f47b517a34c4e85b9be48d920bbc7f086868da7e002473044022014a46b490d93b7fa355301ef9b3673c0dec7da8709a428c4b8396a09e76e3ac8022058c1af2311b3236ba5c6d54fe365caff7ba9d7b4e0eda19b0f7a928c4d75e8ee0121031f5d9b38e052267ba0ca19acbdc527f763dc494a1f37d4f123f51a2dc6ed210c00000000",
+    "cets" : [ "020000000001016e847551f09d3bbba5f71e164b5864bf77ec5ccedbe1e9d3287b5d62afa13a950000000000feffffff0100c2eb0b00000000160014dce053cf1fb9949871c80446b7c5af6625a734c904004730440220583ef6784326627596f4fa2c43388e3286eef04fbd2a3da6479126ca1f6cf1d00220102914cf4fa8ffe510abddaff3e7c973f648c2c092a831ab1a6bbf3755d874bc0147304402206e370f657974a04a51fd219b019396cf7aba02e3fb25061d7859baaf7421515402204024f211aee2d597bc6b2370123756844c4b0d7ec7d16d3ba60a247eb2b629810147522102102ac063486f0ae79be8546b474876a7a95644720b0868c672283b29278fda70210352140f8407a101cf16c639383a86eda01802f47869e0a8bafe1792e084a22a8752ae64000000", "020000000001016e847551f09d3bbba5f71e164b5864bf77ec5ccedbe1e9d3287b5d62afa13a950000000000feffffff0100c2eb0b00000000160014dce053cf1fb9949871c80446b7c5af6625a734c90400473044022040d8d9a2264b2f1fc3c32d4ad82c3d0ffb48b66aa15f15b3e8570beee8fb8ed1022069c44094109139ab0815df28cea375cd8a0123309b4d2b2f206fd6695e712c8f0147304402205b1f59c2112181d0526cfbc8394999ac84aae3c498427328a6253401459c50c502205ef21b6a1afa3cc9f914847c73156cced4cf5279cbfc7d92f5e425a9e80e47150147522102102ac063486f0ae79be8546b474876a7a95644720b0868c672283b29278fda70210352140f8407a101cf16c639383a86eda01802f47869e0a8bafe1792e084a22a8752ae64000000" ],
+    "refundTx" : "020000000001016e847551f09d3bbba5f71e164b5864bf77ec5ccedbe1e9d3287b5d62afa13a950000000000feffffff0200e1f50500000000160014dce053cf1fb9949871c80446b7c5af6625a734c900e1f50500000000160014fd3680998daf5ab74be05d60e57caa312b70b595040047304402203fd7d522dabf511ce1fd2967003c10ede4b36c67b25be61c0caedea74a80e84102200e745f78ac60ff27a44b5612f181f70e260260b2d3c269b9701409b227df104301473044022018fb03e5809df04db5f0cb56d49f1fbc0f9bd7b9ef1485e30d927ad89b61d91302207e57841309ff6bb7f272a24022210b7e9838a277d068e56fa69245034255c8f20147522102102ac063486f0ae79be8546b474876a7a95644720b0868c672283b29278fda70210352140f8407a101cf16c639383a86eda01802f47869e0a8bafe1792e084a22a8752aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "a54ac2fdcce2b8b0e54ed40a3207abc87a193145b26a27b1506bbfdab3d1b7ad",
+        "nonce" : "d8a3c8b9bdc13f2b43350d34954bf53d4651d35c625dff4b34258d4fa4176751"
+      },
+      "contractInfo" : [ {
+        "preImage" : "7350255860171307692",
+        "outcome" : "6a32ce759d7a1dd1892d0131fec42601ac96134f03cf893e4f9e678c51bec6d3",
+        "localPayout" : 0
+      }, {
+        "preImage" : "9026469142865272643",
+        "outcome" : "c7fa947ec0692299eb1d926b3b02669c75654ab4eb641bcb801d258c77db657d",
+        "localPayout" : 171647142
+      }, {
+        "preImage" : "1649357875908549673",
+        "outcome" : "183327f4bd9fbdd209842140bebed985675c2018f31d3fe257081e047317b996",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "c7fa947ec0692299eb1d926b3b02669c75654ab4eb641bcb801d258c77db657d",
+      "oracleSignature" : "d8a3c8b9bdc13f2b43350d34954bf53d4651d35c625dff4b34258d4fa417675147be000777e16eb3f760bacd0a04a7eb90306fcbe9e16d9324a73db23fe0a9f4"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001473810b283f9e8e2f4127074928063e51c94a38c200000000",
+        "idx" : 0,
+        "inputKeys" : [ "78ac51b7db65ada17d535850a86f692af521ec4ef36aa86fd63d59fbd0a96a2c" ],
+        "scriptWitness" : "020021032ee403c112355aa6c9779b6f2a8e36e9fceaebf0fb1a377f17802138a6bd3a2b",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q02m90y8tltjs7dn5x9l08060ynaweq6uyxyzx3",
+      "fundingPrivKey" : "c5892543e0349a3af79f46dc2411318e0d1e924733c0f4224d03470f7c420e27",
+      "payoutAddress" : "bcrt1qkhde439v56c4heq983sjyxdztgevw9c7mys2wt"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001458fe3df7b4507cd577ca223aeceaced3f9122b0700000000",
+        "idx" : 0,
+        "inputKeys" : [ "f9e484e068fee391c1645a5e97b4ce91adf02309c3c9d36ae0c7ef4ec3ca1a06" ],
+        "scriptWitness" : "020021036f98360ec4ae7276eb77a8233ce584eaf00a37cf07d6bcf9e4bf610f89fd9b21",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q89cckmycl343hsahf6unc5kzvz0k8pnjpxgsvy",
+      "fundingPrivKey" : "9ee688713df8401a7ac7412c0f6e6f7e3c65a39d5d453b5fcdca07ec63fcfa5d",
+      "payoutAddress" : "bcrt1qelglnxpmg3ewspye6n647p7xld8t8yga9tmjpk"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71054133733353032353538363031373133303736393200000000000000001339303236343639313432383635323732363433000000000a3b20a61331363439333537383735393038353439363733000000000bebc200fda71240a54ac2fdcce2b8b0e54ed40a3207abc87a193145b26a27b1506bbfdab3d1b7add8a3c8b9bdc13f2b43350d34954bf53d4651d35c625dff4b34258d4fa41767510287db44422f4792e84f8345f390a52ade1abff5154c1572de9ba99f74a186905b00160014b5db9ac4aca6b15be4053c612219a25a32c7171e0000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001473810b283f9e8e2f4127074928063e51c94a38c20000000000000000ffffffff006b0000001600147ab65790ebfae50f3674317ef3bf4f24faec835c000000000000000500000064000000c8",
+  "accept" : "a71ca18f9856f85c9770c7c7031676b4a24e677c5930b3c214672e674e91af19da380000000005f5e100027e1a8c9a52fa6180d516d76f6ae8749a095a18343a57132969929087ba3d702100160014cfd1f9983b4472e80499d4f55f07c6fb4eb3911d0001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001458fe3df7b4507cd577ca223aeceaced3f9122b070000000000000000ffffffff006b00000016001439718b6c98fc6b1bc3b74eb93c52c2609f638672fda716fd01e600d3f5b6de3dcaf97516ea4588e1f2f5fc0eb1788d3b3e48ae3e5f19c9f0b876dae6414a5f17f4de6628d40b848c36186249727961ed969ca8d41138fe70dda9ed0053cc8e0f71e92db03a2a4ec639a1a4da58cfba2371b7e0663bdcabf8c7b6982f6831c5c485b1ed8ef544c6cefd68b09270c725360a2fd7a1f31746b7d2d8123995979ad9f37165e84b3fc1ba62a6469a649a3eb41de41c600a4ae870c73556bc004f09876039cbfdf47f849775964107f1d3cc81bd68db103fd01e293165401a73203969423347f9b6152a6a5f55dc396c8a25c25d3c666b432737e74bec7ff50201f480deeb265142dcd172ec99a8176d259ba577aa1ee9972199ee342b9d664699dad6f1d49bc7d2697d15dcf1fa9aef1b6b69b6350aae853b76aa1076d9293f5efb06a72612cb70d2f2255a08483b4d4ed11ac9234e9b6b5fa0bce6f441792143007340809d0f8a64812611211c517060ef7a5da6cd1f9828d00bf6cf4c1c8e1ea0feb0cf9bb6ce920c5411b239c94dc7bed202c6cffd061852ae22357b41ea22e1008deef66868c6a5f93a4d40cd8a2052fe3022f2900b24f8fa80bd675fefae86a49123d2ae9534469f5d5cd1a602ffbec52ed10cbbcf42f4519783595a5499dd9fe90ce85e88009a3a44ad2f84a4c03eef84db36e6a0a3c8717845ab1f52465d8164e12a5bf2acf20d523eed248ebb386ab295c43650d827b02099e1924fd128fa61b596674e2ce268a9a6fb0da85af249fe6125acb97408450dcdf31c1d5d24d9",
+  "sign" : "a71ed5d9c5b8ddad81055e9fc439fcf9966cf7983d73895fea1c7f5dccb7e9f3d976fda716fd01e601ab6daa0e49c520ee8de3e4601e7c6d8f6794255c582b918e3d982421810bdaba552ca416c636c9434395f28e0bd33f499fa212979365681628c37d9c0409aa63017eaab4496f0b19aa3cf4327a82d664c681ebb0eeeff0f44b65f1e92fb1a8fcbeec9199bb7016310215fd20836a6a9d3a3abb114f9c2146ebe3dfafd354a9d864c4741179a22916c4c225db59f5ca0298a6765a5c7ee115a89d015d9baccc27b301eb531c9fdb351b8f996d390a843ed43d0743c708d0755999512276e1aea63b7dc8c660b0e067123d366a784eb68dcba29e4810f6a3a9b9d3cfe2ef281039655a013ae594bb0fcef1a4477dc69ecd29f057b72fdbc31827afdbb42e44baa88ee6c377cca2dbe6fb094482b25a51fd7bb67ec10d1cad80435634a89a881bc47e129107ed3ab0146d95698f3bcd7fba598d42a507f42d586492646675ad6d395dc3db01580e1a1e1058c6986e0386b4c84de218255d9098ad34cc6988150a29e3cdda98e9d2211a585dbd154d277dc344d24c6edaf30ee421632c3cbd0bf182a23061e2010918517cf450901fdc3dc015e3cafdfcc0fbdaca85628d7d55db4593e53f1faf13502c15b17687d158b45a2858813ee3ac8dccfc9e48ee6c01f756f6b1231f587ae3dc7ddc36ac5aefbebf0b1e6bca569fcfe96d07378e009de5890dde644bb9508cf62a431a249a782d3a452a0f975d3e7dd37713e7d0c407192c1e7186f5a3757cc2483191d614d7ad12c04fa46f919b2f044ae5586f572a3e2ac91d7f843cfda71870000100020047304402205c5db453f9977a3d8539f73f3e895eb1a0b84f69fe699140f1a94446d67a6d8702201c47ef3584311d278e6fbee099f1082bf930d08d73dd958811d275866475fd19010021032ee403c112355aa6c9779b6f2a8e36e9fceaebf0fb1a377f17802138a6bd3a2b",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000002df07e8ee20b710ea44834f05fa409d13e549b6453f6e6283c1a7055e098ba7eb0000000000ffffffff4cd0c55b880da95910f5cf21ecfe6e026b3865f6e6e7cd16de60d7266eb27d0d0000000000ffffffff0352c5eb0b000000002200200458f1149751eb877d4aa96a253ce8f6bc391bccf6a42751507f720f50b15ae5e1dcf505000000001600147ab65790ebfae50f3674317ef3bf4f24faec835ce1dcf5050000000016001439718b6c98fc6b1bc3b74eb93c52c2609f63867200000000",
+    "cets" : [ "020000000001014e03ea4626823a517bfe9d3a4364e49022344d8a2fc758997516f125ee5d56740000000000feffffff0100c2eb0b00000000160014cfd1f9983b4472e80499d4f55f07c6fb4eb3911d01475221027e1a8c9a52fa6180d516d76f6ae8749a095a18343a57132969929087ba3d7021210287db44422f4792e84f8345f390a52ade1abff5154c1572de9ba99f74a186905b52ae64000000", "020000000001014e03ea4626823a517bfe9d3a4364e49022344d8a2fc758997516f125ee5d56740000000000feffffff02a6203b0a00000000160014b5db9ac4aca6b15be4053c612219a25a32c7171e5aa1b00100000000160014cfd1f9983b4472e80499d4f55f07c6fb4eb3911d01475221027e1a8c9a52fa6180d516d76f6ae8749a095a18343a57132969929087ba3d7021210287db44422f4792e84f8345f390a52ade1abff5154c1572de9ba99f74a186905b52ae64000000", "020000000001014e03ea4626823a517bfe9d3a4364e49022344d8a2fc758997516f125ee5d56740000000000feffffff0100c2eb0b00000000160014b5db9ac4aca6b15be4053c612219a25a32c7171e01475221027e1a8c9a52fa6180d516d76f6ae8749a095a18343a57132969929087ba3d7021210287db44422f4792e84f8345f390a52ade1abff5154c1572de9ba99f74a186905b52ae64000000" ],
+    "refundTx" : "020000000001014e03ea4626823a517bfe9d3a4364e49022344d8a2fc758997516f125ee5d56740000000000feffffff0200e1f50500000000160014b5db9ac4aca6b15be4053c612219a25a32c7171e00e1f50500000000160014cfd1f9983b4472e80499d4f55f07c6fb4eb3911d01475221027e1a8c9a52fa6180d516d76f6ae8749a095a18343a57132969929087ba3d7021210287db44422f4792e84f8345f390a52ade1abff5154c1572de9ba99f74a186905b52aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000102df07e8ee20b710ea44834f05fa409d13e549b6453f6e6283c1a7055e098ba7eb0000000000ffffffff4cd0c55b880da95910f5cf21ecfe6e026b3865f6e6e7cd16de60d7266eb27d0d0000000000ffffffff0352c5eb0b000000002200200458f1149751eb877d4aa96a253ce8f6bc391bccf6a42751507f720f50b15ae5e1dcf505000000001600147ab65790ebfae50f3674317ef3bf4f24faec835ce1dcf5050000000016001439718b6c98fc6b1bc3b74eb93c52c2609f6386720247304402205c5db453f9977a3d8539f73f3e895eb1a0b84f69fe699140f1a94446d67a6d8702201c47ef3584311d278e6fbee099f1082bf930d08d73dd958811d275866475fd190121032ee403c112355aa6c9779b6f2a8e36e9fceaebf0fb1a377f17802138a6bd3a2b0247304402204297053b388bc1923e2b784d25c035b249a580b4add27cd67f2943eb354352c602202c3291a220217357f14b936a6a7b223cbe8640ad0991b9d84d35975f8c3dc26b0121036f98360ec4ae7276eb77a8233ce584eaf00a37cf07d6bcf9e4bf610f89fd9b2100000000",
+    "cets" : [ "020000000001014e03ea4626823a517bfe9d3a4364e49022344d8a2fc758997516f125ee5d56740000000000feffffff02a6203b0a00000000160014b5db9ac4aca6b15be4053c612219a25a32c7171e5aa1b00100000000160014cfd1f9983b4472e80499d4f55f07c6fb4eb3911d040047304402204f09876039cbfdf47f849775964107f1d3cc81bd68db103fd01e293165401a73022073fb6f06a61ac692eba1827dc8cefed6640f81e515df1fb35793b607aaf1b1a301473044022043762e32896649ec2a93f6d93c563c61a63e6554948798dd05009ba4584962100220173e30472db2a41a059c4b826a1ecd73fb392f3a38e0d39719dc341ba858f72701475221027e1a8c9a52fa6180d516d76f6ae8749a095a18343a57132969929087ba3d7021210287db44422f4792e84f8345f390a52ade1abff5154c1572de9ba99f74a186905b52ae64000000", "020000000001014e03ea4626823a517bfe9d3a4364e49022344d8a2fc758997516f125ee5d56740000000000feffffff02a6203b0a00000000160014b5db9ac4aca6b15be4053c612219a25a32c7171e5aa1b00100000000160014cfd1f9983b4472e80499d4f55f07c6fb4eb3911d04004730440220144bb7421e94ea6f68d04db1c1f0727ad47c98af31a00eacb8b406b988adb63902200c18a433532b6e60b7acefa8d24d8e6bc0a314cb41731e9c5fe274e27912a49901483045022100eb531c9fdb351b8f996d390a843ed43d0743c708d0755999512276e1aea63b7d022010a4e954c0315e7582e70a3d228abec17b6889db751e2f2356c9bdb4c9534aa501475221027e1a8c9a52fa6180d516d76f6ae8749a095a18343a57132969929087ba3d7021210287db44422f4792e84f8345f390a52ade1abff5154c1572de9ba99f74a186905b52ae64000000" ],
+    "refundTx" : "020000000001014e03ea4626823a517bfe9d3a4364e49022344d8a2fc758997516f125ee5d56740000000000feffffff0200e1f50500000000160014b5db9ac4aca6b15be4053c612219a25a32c7171e00e1f50500000000160014cfd1f9983b4472e80499d4f55f07c6fb4eb3911d0400473044022064e12a5bf2acf20d523eed248ebb386ab295c43650d827b02099e1924fd128fa022061b596674e2ce268a9a6fb0da85af249fe6125acb97408450dcdf31c1d5d24d9014730440220508cf62a431a249a782d3a452a0f975d3e7dd37713e7d0c407192c1e7186f5a30220757cc2483191d614d7ad12c04fa46f919b2f044ae5586f572a3e2ac91d7f843c01475221027e1a8c9a52fa6180d516d76f6ae8749a095a18343a57132969929087ba3d7021210287db44422f4792e84f8345f390a52ade1abff5154c1572de9ba99f74a186905b52aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "3db2498fe7239827955baef8d49ab7fb1fe0a38d070aa32ab6e0cc471911b552",
+        "nonce" : "31c4d82ee15cc8bf5c5d224520110e2c45b1ef541e7c1b70df814179f4df33e1"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-5679211490309197768",
+        "outcome" : "2501597b8a76da778c8bc120852926c0a627e8d9da3c308af5f8686af905edf0",
+        "localPayout" : 142660576
+      }, {
+        "preImage" : "5106476537008487225",
+        "outcome" : "2d524443756fe53e65095fc87472cf2e8e957f803fccf06ff2b0876540cd9953",
+        "localPayout" : 156032278
+      }, {
+        "preImage" : "-4044919780243603527",
+        "outcome" : "4f6765f282f06339a1b73b876ae515c3ac253f2fd8a33930f4783a35cf20e098",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-7442423383613643519",
+        "outcome" : "d2db31d49e38189079fa130eadc8e6e43afafb9675051523fbca22f45f535d90",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-6273746076621721963",
+        "outcome" : "e26b501c8580d1fc8ce459f77b9d6dd799b21a136bb29084bb0898a40abb4bfc",
+        "localPayout" : 28563134
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "4f6765f282f06339a1b73b876ae515c3ac253f2fd8a33930f4783a35cf20e098",
+      "oracleSignature" : "31c4d82ee15cc8bf5c5d224520110e2c45b1ef541e7c1b70df814179f4df33e19ddd2747bc7b65431586f076d8f3ef5850c58ac58692233e1e3f401cf39240cc"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148758efb51b4ac9a57d20e5a727eaff7359d6f1b300000000",
+        "idx" : 0,
+        "inputKeys" : [ "39a5acb49058c4ed7394baa0edbd261b7dd9c74f20fa020892b13e154c73f9e5" ],
+        "scriptWitness" : "0200210394493e9bc722c04804be2191867bac4beed575b9a10bfc7566275fe329c7dea6",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q7y9wwjsg5afkje8ve4ymtsrmz3zhatkku89aua",
+      "fundingPrivKey" : "e6d23b52eb05c99b9c18df211457d6169d94ef54a9c1b218b324ab640a3a5513",
+      "payoutAddress" : "bcrt1q6py8909mkfd03l65uqs3fpf9yguu7hsvfltj4s"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001460f29d08b33a19630348fa9ea148437213b9df2800000000",
+        "idx" : 0,
+        "inputKeys" : [ "ce67adf3e050e10026cf6e4ebffb671f85229cc0f5206106d7f2c8bcf3d740ba" ],
+        "scriptWitness" : "020021025523663b4719e5786cf95571a56954bc3914c8e0ba1b951e4dd0f1f592da9956",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qn2f6p55swnpku69fgdqyvzt77a0g4c4hqvnax9",
+      "fundingPrivKey" : "25d81596812149ef41f105d61ed425591d5baa32068c11902b66a28f63cabf1d",
+      "payoutAddress" : "bcrt1qhclzgr2cxtqgjdjcxcyu45drt7pe498m4c6fpn"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71090142d35363739323131343930333039313937373638000000000880d3e0133531303634373635333730303834383732323500000000094cdd16142d34303434393139373830323433363033353237000000000bebc200142d373434323432333338333631333634333531390000000000000000142d363237333734363037363632313732313936330000000001b3d6befda712403db2498fe7239827955baef8d49ab7fb1fe0a38d070aa32ab6e0cc471911b55231c4d82ee15cc8bf5c5d224520110e2c45b1ef541e7c1b70df814179f4df33e103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22700160014d04872bcbbb25af8ff54e0211485252239cf5e0c0000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148758efb51b4ac9a57d20e5a727eaff7359d6f1b30000000000000000ffffffff006b000000160014f10ae74a08a7536964eccd49b5c07b14457eaed6000000000000000500000064000000c8",
+  "accept" : "a71c5852121d5fdf270126cbacf31e3be0c1b6859eba82094e66e0c2198a9beabd5d0000000005f5e10002bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b48400160014be3e240d5832c08936583609cad1a35f839a94fb0001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001460f29d08b33a19630348fa9ea148437213b9df280000000000000000ffffffff006b0000001600149a93a0d29074c36e68a9434046097ef75e8ae2b7fda716fd032a007f0025bfc4e7a10c6a3e67da9dad330f583c717ffa91120a9ae803c3091121822afb181a4665387c93b7ad0eec955dd33673af01fd9343fe9b9c7c129f62292d0082569ea232e5e9cac0e056042fc38f1a28ee5a28ed35e1c3167e7197a8b27b4f37290a653f60d1305253258317b1c21e3b1060dc65f4956e5af6513571c2c7f0724f9a9f1d6911fd44ebfa049f3d42285d32603fe38ac051eb482f5146953c22016d10d08e6c284c67187786b917c3a696ac81edc5edfafa38077f1a5154e6db83a8540307332bc4546f8ba76c85dd2197247ed9f7ea9ac2522cdfd96868a8d6c101545652dc524b992b4a5f5d963fa42dbd7718560f29af6b8f5ef8ca4615916f0684e01d7b26d19fb020b1384ac8943b46e6a58d21ff285306ccf660c97376c45aa18fe0ff41705f830ed650363df725ab7bae5978497a4d6af718a9dd44da4d6601ea7b2b2c1e21c38dcbf0f4e3faf9e5516a9f09709a9be67f4567c641bb79d4b84525041aba25a9556607b0b772a33d8d7be168ce59946af333bb51abc39712cc00c9ddffd05d3dc540d3797a3088695e47d58723d92c770a63effdd5690087000ad9b870d4c5cd55fa26c54706b1085fd679d7b3414129d824b49a865958f17488250eb347f61765fe5f8ecdf19233b8b4b12cc9f5b4c65588ac7de22a2b4041f200eb64d575e87867b7fc14981628c6bc4a6c4c78726a7bca1e23eaa3522462e69f847efca2c798bd96ede7935d5de00b85f5a6ca3817874397bb028d0c573f874b004a618ff2210a633ae848ceac824d9dc272d4d03bdcdab018aee8fa5713e6b6718577bd6f2879d101430bd078f39b7764b17318342ed61416a089be6c11b41ebf291a68707623709ac32609ff768339459d916ecd2ca0eb6fa2b993cb11a95d060170b361db41f55c47c9df395808cc8d58bd227a980d0395b6c7a6e98baf4d784e14ff71c8ef02796f06efe4e685f604af944500ddbc55c4a1e97e84de68474aab01c8f3aafe2bbd401231b02696021e0f58c3bc81954f8fe48133176c25e5185c293d1a0e038c8a062ab89c20385b520b5f628c1fbde7464c5fbbceb5ffcf180922f544ef0d9e6063f569fe311baccc1ec113d24c23edf3e39c8cd8d1c9aa778bde48ccdd3fb683de9f47cc4bfddf9c4e892723fd6a6ccd8fafb34a9dd220422f9b69ed0bc3250752fe635d7672146589c6fbee3d3aeb4b99e607a8c05b28de70e3",
+  "sign" : "a71eae5092d86180c53a9da1c7e5887b4194f4f89c5ca9b19b2ff8043b1529ef715efda716fd032a00650ccad3c8e8eb0b08dc627f4d78553efd28c2d6049dc09cb01168e339a6019662c168cf6d93d7e2c8b4d9b25144db0043e8e3a9c761ac4840afd0279340d0d201ede5c4c074fc9c21c04a416270cdbd7e904493d6646ec019b013d93373da01a9892ed57f16e9e3b990c04c64d8d0d58fb87734a1ab14c59fc3cd41b9e58c6f77988799ffabdef769ac8168dd015d00e75cfc9ba981319814783f24ec5e8084c2004de42d5b75c104e49b66cea51bafe38d66baa2472aebcb1a58da4aeb7dbe52dc9370f0e5755fa45e693f4831cac06055861551196ca7996ae40ea5b293077104010e40a44e25523cd143f84b4169fc67ffe81abb819450d35a11efac0dece716a2c7fd96dedd5fff82cfa8c41daa3fd6884eb83e9ba17f52a25c265149a93521ea82f003bfbce38bdaa90d5487e762e094159438e7c69b6cf3aa9e4e216a3b5112014964a717628f0af462d076d02d0aa57a8b7390bfa07ddbebd4ee091ff7f48166a634fc658cc7b73a8ee05e5c7c94e18ba0432c371c6b68301d42cd6107cad54501c64f676e2094ee5faac545011efb0bd9873d1bcd079d30ec2ebdc875e6ab29dc527951a9daae1a1a914e02b4b20462c76bb6c9cd4197cf948a139dfecde2b57969afa84bf92ea88bc1e241f43ef3890287986af8ab9b885dd990fac59852c60f00aafe665932d14960d1997289d1bf93764adee8035499e3a0c4c4d1fa6914d753727f494cdcf9f28df21e2d0b81a711cc33f64d93ddf584593844ef2dc2afd0210021792fa5141d686853bd1285fff131b5333ef1045ed734a90b4abc7852ef4e472a56e4c03001615d71f73f620ce6b4f8e4434be4126c9f371bfe25ba5e80b78fb1d54c46a94543a3a52f66529c40d86b8e561810e2c43c327f094de76c1d9eed001810e41074d3eeab1ec111a548ecabe4d5f960f0ec4b21575a965c45c158bfae6500f9c31c4533788d91cb515c9f18637dc2cecbddf3b4a2e1e9d5f03b0969c501acb3969384424ade2c8d63a98cb92c7adf6bc8174cbb3bb3aab33f663da9bd975273d9421e87fde39273619d9d3d7fbdae42c9ac4541ce736d427427d6d26c7c78f039abede3dae71bd7c5c6a2662d20c038ef09129395d95a0482c12a835411065cb52315eecc61cbd519c44a07a5f0dcb9b58f84bae6133aa8e9bf4d9b5cab1ec6d6ae10103ee491a66d9c0cd1c977c8a15b0506e7f040ab3aadb0abc9ff3afda718700001000200473044022020907138d07fc49182e527dc9ae99d99d27b51db2b7680cc857104b265dad973022018139b7f4e1f5cda107061cbf2956c2665fc8747b854557f4203b3464a606b460100210394493e9bc722c04804be2191867bac4beed575b9a10bfc7566275fe329c7dea6",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000002745946155b45834d325cb38f33723040ed524d1d79d3ed267e28fc2d3b59d9a50000000000ffffffff620ab8749b7a0f6a5fcffd36b95d64bee67451e25ade102ab71bc079b4e1e2910000000000ffffffff0352c5eb0b000000002200204fd902894dc0d7c920cf5cb6611ff5bc28f78435eddf68d85bb35da40aac7187e1dcf50500000000160014f10ae74a08a7536964eccd49b5c07b14457eaed6e1dcf505000000001600149a93a0d29074c36e68a9434046097ef75e8ae2b700000000",
+    "cets" : [ "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff02e0d3800800000000160014d04872bcbbb25af8ff54e0211485252239cf5e0c20ee6a0300000000160014be3e240d5832c08936583609cad1a35f839a94fb0147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752ae64000000", "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff0216dd4c0900000000160014d04872bcbbb25af8ff54e0211485252239cf5e0ceae49e0200000000160014be3e240d5832c08936583609cad1a35f839a94fb0147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752ae64000000", "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff0100c2eb0b00000000160014d04872bcbbb25af8ff54e0211485252239cf5e0c0147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752ae64000000", "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff0100c2eb0b00000000160014be3e240d5832c08936583609cad1a35f839a94fb0147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752ae64000000", "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff02bed6b30100000000160014d04872bcbbb25af8ff54e0211485252239cf5e0c42eb370a00000000160014be3e240d5832c08936583609cad1a35f839a94fb0147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752ae64000000" ],
+    "refundTx" : "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff0200e1f50500000000160014d04872bcbbb25af8ff54e0211485252239cf5e0c00e1f50500000000160014be3e240d5832c08936583609cad1a35f839a94fb0147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000102745946155b45834d325cb38f33723040ed524d1d79d3ed267e28fc2d3b59d9a50000000000ffffffff620ab8749b7a0f6a5fcffd36b95d64bee67451e25ade102ab71bc079b4e1e2910000000000ffffffff0352c5eb0b000000002200204fd902894dc0d7c920cf5cb6611ff5bc28f78435eddf68d85bb35da40aac7187e1dcf50500000000160014f10ae74a08a7536964eccd49b5c07b14457eaed6e1dcf505000000001600149a93a0d29074c36e68a9434046097ef75e8ae2b702473044022020907138d07fc49182e527dc9ae99d99d27b51db2b7680cc857104b265dad973022018139b7f4e1f5cda107061cbf2956c2665fc8747b854557f4203b3464a606b4601210394493e9bc722c04804be2191867bac4beed575b9a10bfc7566275fe329c7dea60247304402204fa9c6501751d28ae68af10a903253f50f9f1902c96ec8b4fb0028147b1d87d702205fb77e084999bc8f876ef30d7212334a543e79932f2c55eb77500cb83db5277b0121025523663b4719e5786cf95571a56954bc3914c8e0ba1b951e4dd0f1f592da995600000000",
+    "cets" : [ "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff0100c2eb0b00000000160014d04872bcbbb25af8ff54e0211485252239cf5e0c0400483045022100ea7b2b2c1e21c38dcbf0f4e3faf9e5516a9f09709a9be67f4567c641bb79d4b8022028451b5d6c14743dd24c85e87acb7fa32fdd9c77ce80defe39ec51d3266da9e301473044022005dcac95faca76a63df7ee0e34823069fe4ef0ba43c0534baa3ab01d26aec40902207754047a7d23e355ca317dd05be60cde64425a7d326f85ec193f8fec34a6c89a0147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752ae64000000", "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff0100c2eb0b00000000160014d04872bcbbb25af8ff54e0211485252239cf5e0c040047304402207df145c661a1014281d904bb13441d29fa0a35ba327a57d3dde18ba20554f9b502202c175ab179adbf9c8056991c41dd6b248c5e190f026c2bc6712604651865715f0147304402204964a717628f0af462d076d02d0aa57a8b7390bfa07ddbebd4ee091ff7f48166022012d0a375158f95480da3890d23a28cc9c174861e4d2a2f97ce792dee3e909d880147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752ae64000000" ],
+    "refundTx" : "0200000000010103cc05b29f22c61849d5b82be6027d4255a14096166b6abb3be25f3ec58002f60000000000feffffff0200e1f50500000000160014d04872bcbbb25af8ff54e0211485252239cf5e0c00e1f50500000000160014be3e240d5832c08936583609cad1a35f839a94fb0400473044022048ccdd3fb683de9f47cc4bfddf9c4e892723fd6a6ccd8fafb34a9dd220422f9b022069ed0bc3250752fe635d7672146589c6fbee3d3aeb4b99e607a8c05b28de70e3014730440220065cb52315eecc61cbd519c44a07a5f0dcb9b58f84bae6133aa8e9bf4d9b5cab02201ec6d6ae10103ee491a66d9c0cd1c977c8a15b0506e7f040ab3aadb0abc9ff3a0147522102bb8c0fcee204f2135242366eba2b93b246ad120137b29d9d6f0970a06915b4842103e22e6c4866939f7203fe5dc86952e3b0ac1a8191dc30c9f29bcc5c7df042e22752aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "d8b43b7466d4bcab755f2550031812c4e9ec1f90eae42db46e346f22ee11def8",
+        "nonce" : "cc61873ffd2bae18d3bd8f5d81dbe71c4e6fcc0146bfddeed40179038d2bd8c1"
+      },
+      "contractInfo" : [ {
+        "preImage" : "6194994215602541407",
+        "outcome" : "934987a6cefd2f458c5a762c5ab2806ac590bf413e27a7890db49ed34854f247",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-9083303114326935491",
+        "outcome" : "14d27fb052436021a6fc80b7b594d5fbf11c28fa3aa2f4916b9251c8b6c9c092",
+        "localPayout" : 99205106
+      }, {
+        "preImage" : "-8092736784391068876",
+        "outcome" : "07e09e1eb1edd12130b70b9f32532b394ec3e238be6c9e7f758146ae5217ad6b",
+        "localPayout" : 43285281
+      }, {
+        "preImage" : "3381879394168392102",
+        "outcome" : "46fe3818d6627d50a6e803142d3825b162655795b7661bd5b38018c0577ad823",
+        "localPayout" : 196798379
+      }, {
+        "preImage" : "4667059353610620405",
+        "outcome" : "66ab5a9ebdd809f7b87836e13ae079ad16b3f9b88310ebb2d29a7d3ae16ef1a1",
+        "localPayout" : 151205711
+      }, {
+        "preImage" : "6738773109862863216",
+        "outcome" : "79e0994657ed14a3cfc7f183a497a878a79045315aa750ca9c062bfcf7fd2f5b",
+        "localPayout" : 115568891
+      }, {
+        "preImage" : "3091306109267852544",
+        "outcome" : "68d86015296798431766b599d332d00f7d83c25e82f30cd8c81313ceaa2a3360",
+        "localPayout" : 17551409
+      }, {
+        "preImage" : "8516259953640633002",
+        "outcome" : "65e851875a1fa1b1707303d1dbe137b7bea60038dc815a88e539bad17c5cfa73",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "66ab5a9ebdd809f7b87836e13ae079ad16b3f9b88310ebb2d29a7d3ae16ef1a1",
+      "oracleSignature" : "cc61873ffd2bae18d3bd8f5d81dbe71c4e6fcc0146bfddeed40179038d2bd8c10ffb720d9a9fb31088c8af2ff522cda9289b051537ed757c9a79f90b981ed9a0"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014cf7530831f7bfe5fe76731c3a2d6267309723e4000000000",
+        "idx" : 0,
+        "inputKeys" : [ "97fb6b7de4e762e4dc09e53d0ceb9bf3e6190b9948afa35a2a7273390742b3ec" ],
+        "scriptWitness" : "020021031a1b0f4fbd943af10345c5c6d279beb03591b6ddbae0f93c5128ce568f33195e",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q3u6a6hp5sc8lk7xwl8dz5jh2pdnacpqcjwak3n",
+      "fundingPrivKey" : "3b10671fa8ccdd0fc45c0c76c45b9d53030f9f548b0f05dbea9e05eb059b9715",
+      "payoutAddress" : "bcrt1qq05xxrc2v3snzsgaavrd65helg384g45c0pgtr"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600149cf96221412d05c7e7855341d049518dd80448b400000000",
+        "idx" : 0,
+        "inputKeys" : [ "fc92152099ae2bca3d7722f302582d348eb576319b427668b73404ea1576289e" ],
+        "scriptWitness" : "020021039aa2d75f3f883077eea10d2dc05f43a4f07ac024346e83c9048fa00ad5592fd6",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qag5g7hjqpukqq5hkfskhuusjdr725a524fkra0",
+      "fundingPrivKey" : "b5f3d3bd7f29e7250d573510e4ebe16c90b852cd808139ef26cbdf8b560bdc1d",
+      "payoutAddress" : "bcrt1qvus3x23u6guaz7qyaqupdwkcsqlrlu07djk2f0"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710e213363139343939343231353630323534313430370000000000000000142d393038333330333131343332363933353439310000000005e9bff2142d383039323733363738343339313036383837360000000002947b211333333831383739333934313638333932313032000000000bbae7ab1334363637303539333533363130363230343035000000000903374f13363733383737333130393836323836333231360000000006e370fb133330393133303631303932363738353235343400000000010bd0311338353136323539393533363430363333303032000000000bebc200fda71240d8b43b7466d4bcab755f2550031812c4e9ec1f90eae42db46e346f22ee11def8cc61873ffd2bae18d3bd8f5d81dbe71c4e6fcc0146bfddeed40179038d2bd8c102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a200016001403e8630f0a646131411deb06dd52f9fa227aa2b40000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014cf7530831f7bfe5fe76731c3a2d6267309723e400000000000000000ffffffff006b0000001600148f35dd5c34860ffb78cef9da2a4aea0b67dc0418000000000000000500000064000000c8",
+  "accept" : "a71c612e1faf41bc93ed4d3ac47cff1182ee119911b0c301bfeb2e5035f46bcc68c50000000005f5e10002d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c868001600146721132a3cd239d17804e83816bad8803e3ff1fe0001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600149cf96221412d05c7e7855341d049518dd80448b40000000000000000ffffffff006b000000160014ea288f5e400f2c0052f64c2d7e721268fcaa768afda716fd051001e8ded937a611dd30ea6b2818a1d2de7c5752edcc2004e2db2c4a3d6de2d0720ffbeeeb321788545f6820586c1efc1a0f9a2d1499deb39ac15218c3c72487051c01c5b28290f515f2d432bfd5cb96831989b83f7181c3784f65e52ad5732c66cbbedf6f82ceb73951be2be417ce5885c90530866d93d69e27ff6bbc5255f3f5be16f90bf2e05215ef6f8e401eb9434c6945e163e2c2f5ae35a94010265bc425c890007bd31046affbd37e09139a0e8d3f94cb7ca254ddd4918453d684c7fcc75753af6578febf1b409ddbe8f8a0d135b74c910fd76a9f78c2a9ef4a731ccfff894d4600348351b3dd5ae11e665868991602efc42e129ed2a695c53c747d51a9c69bdb97ad0cbddf734718338a9b803cc57e047f9cc20cac2d9a18da31979adc3403d0b3c8d2e76970f8ba5bb08e1380c186c0a6b51559ae63215b3cef21a8700eceefce0031d06ba3ade4143a4c0b91d58b824393a32e9da1ac3d37bd57b6c2e4dba46d9184482c8e3357021e1d80fc29762a197466b73e6a7747fe6bb9c1988437b11513006cf10bda9fefd633f14785d618d98877d50811e5c4ca0a83551477120ddefa6530bb9cfe52212b8ae16cc60a87bb61ae3581ba5ab5eeacdb0bf5e3e0bdcdb004496e611b2449dab40eece9a747cf4c066df2683fa915109a00dfaa6303247315004f216a0c131db866b91cf3333c4785f008032f4d1937e4f3a8633844343c8390af936ed95e95a88346196f7f9d2e310585643f280497a0c51d26ad6f18dd9fc900a41c1a66f84e68134de11ac1fbed31e7c9549462b2d9e108237c7b871226245ac666f68fa5fed70016c91581033626863e45ec386f3cb958f7f2b3d8deb2e7df22eb97230b4d11d24fab9e2da2accbe5e9aa52f21dcd9d93e880fd1ed5f78b7d01027d5fb2760e61faae9192a90f88a2669813ca24c227476ef48d8671a8b258d850554c9d082a70e26b5a937c19a12984a4e12862c1ed5e448e789ec004dc8e85012197c74b69d28da2d57d9ea67ed6777d27ec171345ca327904c8e9aaed785dddf9f8cae3d043a8590d0c806ba6377ac45d35388fba4010670322409d169239273df28e5145ec2c502e390da6704936bad57c5b2752dc9854f7fecab1540221fd00496af73bbee55212cd1731a9052c2623027812c12ebf8ac1efebe0d2c4ed1ec8fb922ee33fd92e659fcaeba7a78c9c5f8eafa85cad48c029158f2e03c386c8b300f6aa03aa1679fe0fe95fa8fd67d938d286332b38de612b73b74163129b85e0301ab64b0050dfb5e4ad9ff8d40857a2855857c1863b1fc9640177c3f391c050605a844efeaa63af90871ee847627bbda85050d2908af8a354d14d025674c88385003f53790d1a5dbe9fe56d4de82c4abe41c768d4466529afba34885b59de87f9cceeaa959ce02e1c154f19e6aaee9060c8cf963f1a3753e2548088f904b9e12dd201fdabbf7531b324e6aaf6b73f17f71cc40bd975d14ced244c61cbcad3be6a2156cc8a305cf4cde05d65c6dd10dbcf029788b4030ca2ede847b57521af49d2fbe7b534bca2f72f810365b477c58ab8c50226bf58c6c51d0ccd4c4448c66369d21700b9d8cf8ebaa9daa8229f5a8f12bd59b448c87819a02050dd4055872a68a9ded7b555e23332572407cf52dbdcca9729aa3a88da1089d83b45963950b697c76a3a003744da9df7bfb7f0d7e6f510840acac0194f71a82cfbb97e0cb0ecb8fee501e47bf1bb09adb8825521fdd4fbbe659a23638dc4aee70d5ae32c648c724e59cf8e4741e3ad14c2130544d16e4adf8b6b7ed6154c6937cad2e6982f635385736a632e8fe44f087acbbf9f3d133eadcbcb6321cd448d27217649fbffa8dfc185aff86550e2115e0ff2a8c767a071a87187acda2d80724993d3551a6a2eb451f715d9",
+  "sign" : "a71ee1958084cbb73a2123a797bd5e2a7aa45cb6af1c75a85ac70669829c0b4f31dffda716fd05100171df474828fa692df1fe2f0bafc187b7026e38c73e11a632d38dbe40973d883ad8190fb48e143adbd64257ccc8e1a29856e07ca6d4fe9462534066a58c098eea00444dad13c7094e4b1e9c5dc2ad672b1c5848a3e0d25395bc9b4f01e6f368ce10cae40d44f177ef1bdaccbc4d0075fbef72cfbbea23c5f8d16457a9c55c73a523a0dbd7c442741ae950ca8f46dd49b452957b1e46236366c4ad3cb144180812f80084a4d418d552e69448aba841aab888ed30ae6918c33f28bf75fff52d660c662fd987f98db7db12d034038a5a54f4571d5e00ff45b9e3efc1db067c41148c9dd001c1b47676ff506b09ad9c14621aff6179dc0e937943666f4b2f42ab937c2ac4d78810ec98ae10d929219a3bc81069b650f5642f47b226f91884ea59084912c5707a755d0c90fc6d933f07bc1dcd218efba074a369411ce15a904cea64abd3134b0161ee4cfa75f6e19877f9bcd0c46f9330defe7377eff1e039303a3f7b14923ceeb87fd5ac8b50f14fb7826342888517fe017bb1e99b121db22ad1a530d4fe83a300a766299f6bb9ef80f2605eb3be0289a726cbb17eb23770b04c755392ca0a7cd6c18f9598dfc2084d0a998468ab2505bb174e7486efe2116150d3c62a225d2602c9c6be1d2d9c0d8f092c430abfc54b40b29a829b71f1abd1a7290695b9e24805003e11d2e1de33cce0607f483cc1146e0af635bf091753eb5bfdad437e967b1895528a8a408d375e8641ff73185516b03f79a84e5f653a9fe380bc18accd992fec01304af3ba2525fd302c9fa8cf20a2c0d3de5a84ab0e92710b69aac27a25c6d6cb399565f8a81990bb24caccfbc46f2375d95e1738c1fe12dbca2fba643f2eb6eca84825a6c73437b4ae993692c997a69fed24754958ba7bd2bee3bcb1233f62fb006b5d4f5dca309d707de89026d198f44a8d0dc58cf1071a282c996510c1227d1e6ea614f278633f5bcb0f057b04f0c621e4ff4a23f77f51f2f3028e2d359c40d100c36ee044c90ea882448341bb7a81cdacc26b78f2c0ba2a2b7d0335909eb0f4b4a5b46648bbf680c284684bb2cbba36633edaeedb63e42e7c3e8625ffb836f5547e0d7c11e212a1014326b203fbf509b258b1f78eb6f7f6a183ccfd52e2f1c0a601ef0278572ec2d1a6dc3670823cc1ed027288e84d5d56d9842c92d2eb58a269ebe51988ecf46f91b02658a05793c2442b5c6853b361b2b8bed82071aac0bebe470063e545b9067cffd1195bd76b1857b43d0f398a95bb662702dcfefa41c434b04cbf611ce97049c270bd271288e9336286b34d29e95e3a2139f8eddb24f94585755a355a3e8f65f7ba361dea877d65ba6d4b3589e6f782ebd2db82816ee53caff801f61817ac37de850729a841551e495641ba964b7255d71abe24cbb74294d00892055ace0e1bfac8bba3170c3acf5ebc3d9750a7454636f67c45bf15481e5360c70021109010a4043b173b2fc2a524e6f8e0925e28c5b40f5ac10ace543c35df13624db5a4e6397976fed6f5d6fb1c82f06f53863dded898981f460b2b37726adb4e90e2798c5008c7a572c2fdaaf6c549ac927e127d08f527d4bccfa77ecf95fc00011e70c20ab708e66888e1094c8f1c093a4e7f57041fa66714019325c01f7925a5fa88f2ffc8f5d830decf9568f3eeaf0ad287fc732fcf80357df5b95f02d918ce00ddec8bd6b86ea1b864913de6b386eb7f0eeb82e51513e6be654d8dc27868a10c14f5e3d5ecb995273fef336aa46a8412571dcb8b4ca35d0133fdb08917f25f1beb2f13d6644c9db9f11965bb86a785e783c326cd8657fc43c19a86392869b20a5f1db7163710529a6398aeed3cbd304677ec0d92d27c05cf52d5d64f21fa2a2c6d84fe256f738c87f4d51093f1119d73aae27c1cd1cccc78972dc268952034c9fda71870000100020047304402201c595b1e6329917bb4dd02f89be478de9a374b95783b80cbfa2650f38123b163022069f228c5d18e5969b7c5ad8411dfbd7599b6dc377c5d22997e43a1220e29bd56010021031a1b0f4fbd943af10345c5c6d279beb03591b6ddbae0f93c5128ce568f33195e",
+  "unsignedTxs" : {
+    "fundingTx" : "02000000023d919b17b9ba01b7a9a9995a8eb2b31b9c645bd0e907473779c407431337eeb90000000000ffffffff995341c964233060683c898d923ab927bd1cbb0d8c9eea47bfad3a014d6760bf0000000000ffffffff0352c5eb0b00000000220020aac5e68c0693a582d1aed33de6b19f36c30ee6fc25c13743c778413e04cd911be1dcf505000000001600148f35dd5c34860ffb78cef9da2a4aea0b67dc0418e1dcf50500000000160014ea288f5e400f2c0052f64c2d7e721268fcaa768a00000000",
+    "cets" : [ "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff0100c2eb0b000000001600146721132a3cd239d17804e83816bad8803e3ff1fe0147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000", "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff02f2bfe9050000000016001403e8630f0a646131411deb06dd52f9fa227aa2b40e020206000000001600146721132a3cd239d17804e83816bad8803e3ff1fe0147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000", "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff02217b94020000000016001403e8630f0a646131411deb06dd52f9fa227aa2b4df465709000000001600146721132a3cd239d17804e83816bad8803e3ff1fe0147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000", "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff02abe7ba0b0000000016001403e8630f0a646131411deb06dd52f9fa227aa2b455da3000000000001600146721132a3cd239d17804e83816bad8803e3ff1fe0147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000", "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff024f3703090000000016001403e8630f0a646131411deb06dd52f9fa227aa2b4b18ae802000000001600146721132a3cd239d17804e83816bad8803e3ff1fe0147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000", "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff02fb70e3060000000016001403e8630f0a646131411deb06dd52f9fa227aa2b405510805000000001600146721132a3cd239d17804e83816bad8803e3ff1fe0147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000", "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff0231d00b010000000016001403e8630f0a646131411deb06dd52f9fa227aa2b4cff1df0a000000001600146721132a3cd239d17804e83816bad8803e3ff1fe0147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000", "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff0100c2eb0b0000000016001403e8630f0a646131411deb06dd52f9fa227aa2b40147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000" ],
+    "refundTx" : "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff0200e1f5050000000016001403e8630f0a646131411deb06dd52f9fa227aa2b400e1f505000000001600146721132a3cd239d17804e83816bad8803e3ff1fe0147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "020000000001023d919b17b9ba01b7a9a9995a8eb2b31b9c645bd0e907473779c407431337eeb90000000000ffffffff995341c964233060683c898d923ab927bd1cbb0d8c9eea47bfad3a014d6760bf0000000000ffffffff0352c5eb0b00000000220020aac5e68c0693a582d1aed33de6b19f36c30ee6fc25c13743c778413e04cd911be1dcf505000000001600148f35dd5c34860ffb78cef9da2a4aea0b67dc0418e1dcf50500000000160014ea288f5e400f2c0052f64c2d7e721268fcaa768a0247304402201c595b1e6329917bb4dd02f89be478de9a374b95783b80cbfa2650f38123b163022069f228c5d18e5969b7c5ad8411dfbd7599b6dc377c5d22997e43a1220e29bd560121031a1b0f4fbd943af10345c5c6d279beb03591b6ddbae0f93c5128ce568f33195e02473044022045452d44277d73ae5dbc68c748965d465fcc5fd7bbc2cea249116d107679f68e0220337dd8c13205f531b1106e417fe9641c2096a4486f93b2cf500f804ca53525020121039aa2d75f3f883077eea10d2dc05f43a4f07ac024346e83c9048fa00ad5592fd600000000",
+    "cets" : [ "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff024f3703090000000016001403e8630f0a646131411deb06dd52f9fa227aa2b4b18ae802000000001600146721132a3cd239d17804e83816bad8803e3ff1fe04004730440220027d5fb2760e61faae9192a90f88a2669813ca24c227476ef48d8671a8b258d8022043047699b549e0eda2e9686319333aa9903a4db992243374db66f438fc4e0932014730440220431926e2711d2eb26bdad69e041afcecb39ff155a31510766c23184a5d8a3396022065d9564b04c0d034f493e1f2d17980930f2991f09624f4f1d1fb37ab8880a6f30147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000", "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff024f3703090000000016001403e8630f0a646131411deb06dd52f9fa227aa2b4b18ae802000000001600146721132a3cd239d17804e83816bad8803e3ff1fe040047304402207c0b6c313de83c321cc1945e6926d7403035d7ab58adad3495514b0015a5740e02201c2432267288114914a95a0a0d455947a217809d090f31bcb9c2ffd8c19d2f810147304402206b5d4f5dca309d707de89026d198f44a8d0dc58cf1071a282c996510c1227d1e022022c642ce44a1166e740077111ef67236963f7eec463657f81733d915f4aaf9940147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052ae64000000" ],
+    "refundTx" : "020000000001011a59836068b739282ce5a9b6acbe2f4d4af83ba1c1539d6ecca90b8a2b9fbb800000000000feffffff0200e1f5050000000016001403e8630f0a646131411deb06dd52f9fa227aa2b400e1f505000000001600146721132a3cd239d17804e83816bad8803e3ff1fe040047304402202e8fe44f087acbbf9f3d133eadcbcb6321cd448d27217649fbffa8dfc185aff802206550e2115e0ff2a8c767a071a87187acda2d80724993d3551a6a2eb451f715d90147304402205f1db7163710529a6398aeed3cbd304677ec0d92d27c05cf52d5d64f21fa2a2c02206d84fe256f738c87f4d51093f1119d73aae27c1cd1cccc78972dc268952034c90147522102d4501515b05faf32c02900ae15fe609e92e166f0b9019efe24216c47bb75c8682102e634d13dcb6992032c6470c9ebb8131d593ae8eec95ef4a6f3529e2408ed6a2052aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "9f60ed0ead63514f08c193d9ecdfa44f63226fb3f15f09ceabb536957fe36d9c",
+        "nonce" : "4e57d39b772dd76a95b88430359af62158dd139cc00ef50d6dadcdb0478a09ea"
+      },
+      "contractInfo" : [ {
+        "preImage" : "2358682819017244134",
+        "outcome" : "04464878e737823c817b25a4213cb7bedf69b77b5f1b578836897a444733df41",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-6576012108876463965",
+        "outcome" : "21adbe8f4a7ead237f74241bf3f9fdda2f3dfa1ce7600bb98a93c9f8efd6ae39",
+        "localPayout" : 9677059
+      }, {
+        "preImage" : "1363115310753055441",
+        "outcome" : "54c3828028f507a2d8a8671531d05d38a82faf53a62e7814db087941d2c1a80e",
+        "localPayout" : 163810916
+      }, {
+        "preImage" : "-8813899824081249559",
+        "outcome" : "2c8c2f508f0b47d9a6d6cc64c82dc618719a6220354074956d17ae1b1b28225e",
+        "localPayout" : 89516
+      }, {
+        "preImage" : "1765042088360494170",
+        "outcome" : "288182a643758e567b7ce4e500bb47f6950c24b8a96f544fe385da49df294268",
+        "localPayout" : 7680040
+      }, {
+        "preImage" : "8517807843075988941",
+        "outcome" : "7b818ffb7dfeda89adb6f6c85be73ed26e3e1e704ecff8fb24770a50540f3bf4",
+        "localPayout" : 198467026
+      }, {
+        "preImage" : "-1108509326554218298",
+        "outcome" : "2dbfc7b75953a8d6bed9e0c1fb2a990d65a3054c27b8181592a999263bf231df",
+        "localPayout" : 58614052
+      }, {
+        "preImage" : "5898991671124949189",
+        "outcome" : "70f67f6ac5290db9be31df4c171026e2a91965b24b663ff04ace93b9d7f6c1ef",
+        "localPayout" : 37699272
+      }, {
+        "preImage" : "-602397400454975407",
+        "outcome" : "36e7e816112a8444dd94a2f6e674d18ac3b90916c8395c8e0afc97809c53cf51",
+        "localPayout" : 174699514
+      }, {
+        "preImage" : "-8496441306110143339",
+        "outcome" : "18696c0993355582487f9e557cb6694abb945932792285ce53bcbdf009831116",
+        "localPayout" : 63989453
+      }, {
+        "preImage" : "38496409860162674",
+        "outcome" : "29f18a475da0c74c4bfe605cc2430f073d07251339a7ef22c85fbecd5a949ac2",
+        "localPayout" : 13761654
+      }, {
+        "preImage" : "1283829730184900153",
+        "outcome" : "1ad1902d901b047c6ea95d9cfc22b1379cf3ba01ccb638e9ff97275a98e76d23",
+        "localPayout" : 102489851
+      }, {
+        "preImage" : "-6103297457477642397",
+        "outcome" : "b5d15d558e242b3d6c5943ee756f8d817b88cf348c08eebbfb6c8bedc87ccd6f",
+        "localPayout" : 85092727
+      }, {
+        "preImage" : "4780448293880757255",
+        "outcome" : "94d07f9cb3fc29f7a3ee64a2729d101317f62bd9a4c3ba0b088ac7e7a1721a29",
+        "localPayout" : 78512731
+      }, {
+        "preImage" : "-8829950459202072608",
+        "outcome" : "8da5c5ebbb184e0a9ea7f1ab8e17a73bcb7087cd19c764feb9eb8cb1f86a7844",
+        "localPayout" : 139523726
+      }, {
+        "preImage" : "4923013055417991445",
+        "outcome" : "c9b468f5f97200e44147304e3c0e6b72928ee19f3a5bd9582c8d31b9f063ebb2",
+        "localPayout" : 164851175
+      }, {
+        "preImage" : "-5293268413051192018",
+        "outcome" : "620cec1c6f89d0b5f8ec71c99eea20c4e0743c676d0143f23036216e250ae3a8",
+        "localPayout" : 58499398
+      }, {
+        "preImage" : "4954874381965947607",
+        "outcome" : "252e1716d620de8873881a6a62d6a7c2cb718a7008e1a40bbb25bb48dbf940c4",
+        "localPayout" : 73851667
+      }, {
+        "preImage" : "6065639409910574942",
+        "outcome" : "9b3fc750915d9227ca933c08e145a92bb9bc66e20045cc1441231b8d8fa79e63",
+        "localPayout" : 75887571
+      }, {
+        "preImage" : "-7086431634342275827",
+        "outcome" : "d62f1ebed7452c6f724f0835dc4cd321e2867ad0c096af4fb09b52f73e611327",
+        "localPayout" : 88247566
+      }, {
+        "preImage" : "-5674101699675385902",
+        "outcome" : "d4eae1499d083d0266aefb37f6d764b70254b1958b517675a1e3950458415abd",
+        "localPayout" : 73762914
+      }, {
+        "preImage" : "-2887993386744500261",
+        "outcome" : "6a5075d724ba35078b3e91d5f05e2d2108d103de1c1fd5e0e98de4a7c9c8b38b",
+        "localPayout" : 190440852
+      }, {
+        "preImage" : "6819164965471026688",
+        "outcome" : "35f76b8b14ef6771ed9ae12df7e8c99a0c809ba89617dad7940d6c6a79b1fe49",
+        "localPayout" : 157518085
+      }, {
+        "preImage" : "4027888528788063289",
+        "outcome" : "2d254c001731e713f4d5f641c4d32a00d4fb4cd696890a295d2969c547988798",
+        "localPayout" : 34476950
+      }, {
+        "preImage" : "263964982830625910",
+        "outcome" : "2fb39e67102d7f1c8ef274e231e085f204e6eb83919c491e6e29133eb6dcc076",
+        "localPayout" : 11803943
+      }, {
+        "preImage" : "4738657519276597901",
+        "outcome" : "cd764c538715cdecc34fc3183445b14d01b570b5a1ad39488fd0107da5bf7ba5",
+        "localPayout" : 18544628
+      }, {
+        "preImage" : "7367349223183989277",
+        "outcome" : "7187dd8dcd7ce1526d19eaecd84c503818ce589ff303969d9370462edc1a47d4",
+        "localPayout" : 107854295
+      }, {
+        "preImage" : "2840115552324667285",
+        "outcome" : "1aac4bf194455f88016533364caf49e0a4dff0a1c91dfb9f35849b9ad6ab64ad",
+        "localPayout" : 96626774
+      }, {
+        "preImage" : "-5276229649467464767",
+        "outcome" : "1913b1088f0c1ead2d4f3796d5a287f040bc68c645e126130cb759fae507856e",
+        "localPayout" : 78353354
+      }, {
+        "preImage" : "7548946144352084874",
+        "outcome" : "8cfbf201ee41bc62dfdd958a5c9647ad52ffc3778aad91b30cdfca126f16a04b",
+        "localPayout" : 101256320
+      }, {
+        "preImage" : "-7401271247825360432",
+        "outcome" : "0aa436349999b52a02eccc81b03597fe44b483f02e05c3176d40fd5778e166eb",
+        "localPayout" : 79678216
+      }, {
+        "preImage" : "-7414767124764430462",
+        "outcome" : "387f63d0cd8fc6241a6b9452e987cbe7148c1ef2f8367ba7d17a0c6f7a730f08",
+        "localPayout" : 177504358
+      }, {
+        "preImage" : "2554160283518965345",
+        "outcome" : "b32b5be39f2bfe288e92f57ef38e9878fe06a8f1e62fe26e9acbb30f38cefc5f",
+        "localPayout" : 90498570
+      }, {
+        "preImage" : "7768895868518855957",
+        "outcome" : "9c51bd8047f05b9fdea3cd7e449bdcb53c73d6a30ced99d440543480d453ce72",
+        "localPayout" : 158309516
+      }, {
+        "preImage" : "-6580428537041973384",
+        "outcome" : "43ce44d5d598b6b3da3cab4657839a7fcbf27242ff9b83e8ab0ffae50a09ce72",
+        "localPayout" : 89796098
+      }, {
+        "preImage" : "514162581386390595",
+        "outcome" : "7d816cbf6a6980d17b2275ab4aad75d9fb9f93db607407e23a0b3bb0feacbcd0",
+        "localPayout" : 16639596
+      }, {
+        "preImage" : "2507857364789625224",
+        "outcome" : "abcf0b375e1d16a3f716208d3828562cba2c52d4d854ada41aebe1254f1e42b4",
+        "localPayout" : 96314835
+      }, {
+        "preImage" : "-9205320363291126892",
+        "outcome" : "6f12127c5030b8f39bf1bc8e0a259cedb5005f25dffc346a8bac54e67e852320",
+        "localPayout" : 103069597
+      }, {
+        "preImage" : "-1115848613258088904",
+        "outcome" : "b78c0415a1de86bcbdc2a5e387dae0b450cf9aac29561479cde7fd66718a5b7f",
+        "localPayout" : 155107384
+      }, {
+        "preImage" : "2328899142879127169",
+        "outcome" : "ca92c5dc04b3e52bbf71267f7ad46ce800e20d6a3637ada4f48671b45bb93629",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "2611996121571189609",
+        "outcome" : "cf064931898dc7fca13b708c12d51b928a4589f73431cca5f069de51a168a610",
+        "localPayout" : 131598822
+      }, {
+        "preImage" : "2930329001960969746",
+        "outcome" : "b6c16a77084abc7a6bfe3381a919dd06a6777bdee47be09253b0b2847e98b94c",
+        "localPayout" : 86322255
+      }, {
+        "preImage" : "5993959645700955768",
+        "outcome" : "74b7d503e82c21e273ea576c3b7773d66ec7c17ec9d968f937d6a5cb4bd57ec2",
+        "localPayout" : 34883977
+      }, {
+        "preImage" : "-5386526047007135800",
+        "outcome" : "0d18551f9e41cefb692ce2706864d59df4357591a4f8f56a7cffdf55c805c585",
+        "localPayout" : 130437299
+      }, {
+        "preImage" : "3912244460706111424",
+        "outcome" : "e7c7f79b1f548ddf335de2171fb66b603a17bfcf3372665d7b05e446f68460af",
+        "localPayout" : 163818604
+      }, {
+        "preImage" : "-4433538083959284036",
+        "outcome" : "ceaf1440504a60bc0468d4a4f82ef6fae76f7c84f855a04bd6d7088840e6dad0",
+        "localPayout" : 6932003
+      }, {
+        "preImage" : "-8936561877011221918",
+        "outcome" : "0f61046a622bbc4aeb8c62b8827bb472af7f221c1b1048ffe120cb21fd429ad6",
+        "localPayout" : 192573617
+      }, {
+        "preImage" : "6764917101301355271",
+        "outcome" : "18b62d16901cf1ab7c365bfe2c2efd2e49fe412f67123830d06395d5c8e16b84",
+        "localPayout" : 13406257
+      }, {
+        "preImage" : "-6853833328018576313",
+        "outcome" : "f8309bfa445b1a2748923a59157d92bfaf8febeacb490157b6c56575cbbdb1f8",
+        "localPayout" : 165847897
+      }, {
+        "preImage" : "8885896604608617316",
+        "outcome" : "0bdcd602b1e89e7e9f98a05b28f7e211ab7e7273a7138d357708a9e7a0a80e81",
+        "localPayout" : 142203177
+      }, {
+        "preImage" : "-325976427720447386",
+        "outcome" : "5f7d71153b5e4101666524996b6b407b7d349e5104e1e01b13e8db10b3c692ba",
+        "localPayout" : 95355990
+      }, {
+        "preImage" : "-7975247132039467756",
+        "outcome" : "65e592c8bedf7a6d2c070f1be274a89917d52d7f2d3c5e7769f0e812850c28ba",
+        "localPayout" : 15318892
+      }, {
+        "preImage" : "2958002479230045506",
+        "outcome" : "96f497ab6617db7ba632a4a0ca3bdbe604eea3045fa7a2076288e1806d8ad23d",
+        "localPayout" : 96109038
+      }, {
+        "preImage" : "-373909797779958271",
+        "outcome" : "8c5736b6f46e6cf1050c5db448cad98bfea2623bea79962de226ff8807a423aa",
+        "localPayout" : 3011892
+      }, {
+        "preImage" : "-4820955387229701706",
+        "outcome" : "73af466a19588006cc9efbc48eb18a547180e8268a1ab56bb1bc8fd81efdb6f3",
+        "localPayout" : 109410480
+      }, {
+        "preImage" : "-7438483366668094170",
+        "outcome" : "aebd88b2d56e904c977f328684b519a9f9ba54afcc79d7b121f9a9a86705d8bd",
+        "localPayout" : 177720005
+      }, {
+        "preImage" : "8573476327025435124",
+        "outcome" : "eb3f925d56336ae2a10aab95ae6b084a9f102ce25fb2e031f539bce2cbefde77",
+        "localPayout" : 104100737
+      }, {
+        "preImage" : "8085862600834667821",
+        "outcome" : "2d823420f1a507ab969c9cf6368a933fc665014624a05896b8ad92ad9034d6b8",
+        "localPayout" : 112340922
+      }, {
+        "preImage" : "-4997203329830954294",
+        "outcome" : "1d55d2d439f87d73be8388f4f9a39c40cb925b8e8f62df2ce85ae0d51028057f",
+        "localPayout" : 74250304
+      }, {
+        "preImage" : "2164370105164778841",
+        "outcome" : "17f3fd72ec073584e99bfea19a5b4d6560b329ec998c9d5f95f8946613f3a6b3",
+        "localPayout" : 16043241
+      }, {
+        "preImage" : "6980536283755659559",
+        "outcome" : "89a406550633ea558945c46a5a8a6f1b63096dd60ddcafd50df740a2d26006ca",
+        "localPayout" : 35675891
+      }, {
+        "preImage" : "4538824454116314278",
+        "outcome" : "30c6513b06f20ceee759673f8686640c1719a34336d83587b5f88ffd919ceaa6",
+        "localPayout" : 80873417
+      }, {
+        "preImage" : "2290508297664951262",
+        "outcome" : "72d189b62228e6db6023c586a84273f7473c04188eedcfec6cac09cc707a13ab",
+        "localPayout" : 1660022
+      }, {
+        "preImage" : "1518260600453444397",
+        "outcome" : "864a17871361a973bba097f56847cab111c092ccd60f3f04f09763933d1a1936",
+        "localPayout" : 79001327
+      }, {
+        "preImage" : "1021459828159489449",
+        "outcome" : "76b976c98343d98a3147fb934ce367f0294e36cde29027e1a5f2f7548cc5512f",
+        "localPayout" : 40183636
+      }, {
+        "preImage" : "4064104935990091213",
+        "outcome" : "68cf87726d290d3b24e45a84d5dc33d56048d896725c595bcdd23dc9404f50b5",
+        "localPayout" : 16744447
+      }, {
+        "preImage" : "-2839278243634918545",
+        "outcome" : "4777ebbb4b2fb67f66d98ce63b747c353b9ea4b13406a0587c488d44b9bf1484",
+        "localPayout" : 62678248
+      }, {
+        "preImage" : "7446660368490629128",
+        "outcome" : "78774921b2213f254c5931ddfc7ef20afe7aa675ad5151a6d84c898c2d4969cc",
+        "localPayout" : 160220944
+      }, {
+        "preImage" : "2843636382935753",
+        "outcome" : "e84e0217432a33a9ff8ac1b983a50e48ad0e4e2c9753ab45d1b96d63ea2a5059",
+        "localPayout" : 164558535
+      }, {
+        "preImage" : "3139190164136568874",
+        "outcome" : "a929c0d2d616be3c06a2cf9c00fded19dfb9b766bce99958db56c68dbd619931",
+        "localPayout" : 163906367
+      }, {
+        "preImage" : "1429485920183274690",
+        "outcome" : "8dcd5b103168e4a42e22796155fe88b03f167e6eb262e1b331fb97835412e84d",
+        "localPayout" : 147880274
+      }, {
+        "preImage" : "1665230167804504495",
+        "outcome" : "01a1db0c4a3436653765bbfe6064a5d90cc731cf276c26f46ce8effd06e2e223",
+        "localPayout" : 44327213
+      }, {
+        "preImage" : "946113979818367198",
+        "outcome" : "a4733a6392db7218019f0685f4cea996139da889d66d6eeeded1473f32fa7364",
+        "localPayout" : 180220551
+      }, {
+        "preImage" : "-7449854794040432154",
+        "outcome" : "9b235fdb583d99dc7408f768197f0a974e7baa0ecfd541b909d39efdbbd4a867",
+        "localPayout" : 122392452
+      }, {
+        "preImage" : "6234368391485856861",
+        "outcome" : "c0f0de9ae12a2e8578cdd018901223fbccc296acbd0550c83e500e8f4ae808fb",
+        "localPayout" : 22696334
+      }, {
+        "preImage" : "-8659127031104038191",
+        "outcome" : "e1e31b9fba42d0db38f16d0a8d81995e17537fc5531eef617f06d0f136e37a82",
+        "localPayout" : 94448435
+      }, {
+        "preImage" : "5195604172494225856",
+        "outcome" : "d4a014a7c7ae70c8a9cc07c7fa5e0548ac9be17fff16cb391e6d23fe07b9704e",
+        "localPayout" : 126024398
+      }, {
+        "preImage" : "9143078269677416527",
+        "outcome" : "10342da3f9053e8c8778b2751403eabb18de95a555068daa2498754b9d8db1a1",
+        "localPayout" : 103613683
+      }, {
+        "preImage" : "-878320746717479796",
+        "outcome" : "7ec750bc70711666b419d2f488c449d3f017eb0fde556f5bdff885d108bd6d37",
+        "localPayout" : 44002305
+      }, {
+        "preImage" : "4057213711051537276",
+        "outcome" : "b097efcae89bc6cabe53d3b28a442c1a195dbc55056acef1d3fbba7c739c7102",
+        "localPayout" : 38763771
+      }, {
+        "preImage" : "-7394655124175377075",
+        "outcome" : "12f2e97132f3a9f4ef82f951007e7b28bb8f8616f8324613ac3c1e6432a03238",
+        "localPayout" : 152977078
+      }, {
+        "preImage" : "-7974684329701451688",
+        "outcome" : "133d514e11fb3a92d14263a55e33b78188a50c0ccb4f954c5c18f4cda7c20760",
+        "localPayout" : 124339307
+      }, {
+        "preImage" : "7026422966851584477",
+        "outcome" : "59e393b1e3db63af2f0f3b2d6634838d6b14d045de080b8697baf352591a1d6b",
+        "localPayout" : 135094964
+      }, {
+        "preImage" : "-9057658815094025818",
+        "outcome" : "7c66ec0428c3660c206e9e251fb1a39c4249d1e36b7296e00239059c734fd6a8",
+        "localPayout" : 46355448
+      }, {
+        "preImage" : "-8211433248727640602",
+        "outcome" : "4939dd59a2a8bcdfe58283a6bad7dad3a64da1d5f2cc820448d54eb3e12bc9e5",
+        "localPayout" : 19102085
+      }, {
+        "preImage" : "-7530894377662619882",
+        "outcome" : "5518654d5d6541485415aa5f695a36d7749f87fefc3a031877880daf50c3284f",
+        "localPayout" : 332100
+      }, {
+        "preImage" : "-1257718408452417628",
+        "outcome" : "fb337262da90dc6f6272ec2a2279797d00d105850c6454cc10dbe76a0f5adbbc",
+        "localPayout" : 16719126
+      }, {
+        "preImage" : "-2110690956620668507",
+        "outcome" : "882ecc9fad0367571c31c89b0223688d9097c6a778dad4feabc5ec0ab4ff2c0c",
+        "localPayout" : 192497541
+      }, {
+        "preImage" : "9151576795056813295",
+        "outcome" : "99d2c836e0064062b39a244715590176d68c5103831bd5ba7344a5a2ec1d486f",
+        "localPayout" : 13442184
+      }, {
+        "preImage" : "7261986102741336644",
+        "outcome" : "6e03400579b47677c6146ee9baa3995968f666ce9210b6721e264d333cba2281",
+        "localPayout" : 734511
+      }, {
+        "preImage" : "-3010224397381381000",
+        "outcome" : "4d46ffbc4408260c5c06c00731a76a728dd4bd7872b665535063a0bfb5d98b4a",
+        "localPayout" : 157157244
+      }, {
+        "preImage" : "-1978831925317642569",
+        "outcome" : "04477a5ceefc320a6ccce820d9c3919680226fbae49db304892dfcfd886840ee",
+        "localPayout" : 153881313
+      }, {
+        "preImage" : "-4848056144133562542",
+        "outcome" : "96479897040eaf758058b424de57830626c966e1fac5ee4c7349fe7e3bd0885e",
+        "localPayout" : 91227128
+      }, {
+        "preImage" : "-7281001048484089664",
+        "outcome" : "c2cbb14f8f5d73235b93f1540f5f9177ee6a8f2c7ea5530334116b98d503c05f",
+        "localPayout" : 183360229
+      }, {
+        "preImage" : "-8629759940693713228",
+        "outcome" : "f44a1dd13803e43822d4d8ebb36ef96c440bf0f175a158aa8e58d8181efb2b33",
+        "localPayout" : 40884297
+      }, {
+        "preImage" : "595053625087392636",
+        "outcome" : "70e854f0fb04257e7f98ed8a4247016aa44cdd13b1e24fdaa9e672333872b435",
+        "localPayout" : 142698641
+      }, {
+        "preImage" : "-2512036692802637315",
+        "outcome" : "87ed38f86cd6514d63ebda335101152ed6b1f96ba7dc7486d219d466d07aac86",
+        "localPayout" : 38711944
+      }, {
+        "preImage" : "6910643767470934795",
+        "outcome" : "9a3282723edb0fd2e5b59c7df79d61ffdee265cb0d0c5b89b823cc26528b3850",
+        "localPayout" : 11053893
+      }, {
+        "preImage" : "4799749250296389879",
+        "outcome" : "4e4c5bfbd60c2e8b6cdddf069698c4d6c06a9bc26e54c9cd39a90abb881afef2",
+        "localPayout" : 19008840
+      }, {
+        "preImage" : "-1707985676489047434",
+        "outcome" : "4789ee18f28e98ac86039e1a68e0247409584ccf7d38ae7749ba3ce5078007ae",
+        "localPayout" : 109332524
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "5f7d71153b5e4101666524996b6b407b7d349e5104e1e01b13e8db10b3c692ba",
+      "oracleSignature" : "4e57d39b772dd76a95b88430359af62158dd139cc00ef50d6dadcdb0478a09ea77c0143f7da0219ed9763245d4c5cff81f14b7ce5b7a1a3adbe1d79468df5ab0"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600144218e1246f8baec108a1c85d2f170278369af96900000000",
+        "idx" : 0,
+        "inputKeys" : [ "32c2c1e6dca7b95f91b301de8c773bf4f1acbe234aa701aa63ae331df55f1356" ],
+        "scriptWitness" : "020021036941813b308c6c2f3e93b257418d145180b3106ece9fe55a92b360fa0a613ba4",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qmmur8azq5atg0ehtdy05r34sm6qd8hnvppshnv",
+      "fundingPrivKey" : "d5208e9df9289d3842029a9a30fcfa76c3a4cc2be1ed137976ebb9588758ae11",
+      "payoutAddress" : "bcrt1qzuudrms5zmu8tfj52cp7dad6kscc6hzmghnz39"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014efa7d610bc52476d35f6c9fcbcb66953caa7755200000000",
+        "idx" : 0,
+        "inputKeys" : [ "a869c0a25a2143d6d4f974286d17702a005e4f653f1dd1058545efba939337ef" ],
+        "scriptWitness" : "0200210267b5a125dc7f2c330f5e004535b0dfddeba83a117e7f6e019f71ef35a1a480d1",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qmaz5wtf6gaa40z6w7mrzz8u4qy0wkv3zxzw2q0",
+      "fundingPrivKey" : "5615fdfdcd74327e9d08dd77a211e0b9b092af3ec86731fbac3666fdaae54a70",
+      "payoutAddress" : "bcrt1qrwm2n8kt6un7wfvgtwp8wd902jkwyw5mf5vy2e"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710fd0b1013323335383638323831393031373234343133340000000000000000142d36353736303132313038383736343633393635000000000093a90313313336333131353331303735333035353434310000000009c38e64142d383831333839393832343038313234393535390000000000015dac133137363530343230383833363034393431373000000000007530281338353137383037383433303735393838393431000000000bd45dd2142d3131303835303933323635353432313832393800000000037e6124133538393839393136373131323439343931383900000000023f3ec8132d363032333937343030343534393735343037000000000a69b3fa142d383439363434313330363131303134333333390000000003d066cd1133383439363430393836303136323637340000000000d1fc76133132383338323937333031383439303031353300000000061bdefb142d36313033323937343537343737363432333937000000000512697713343738303434383239333838303735373235350000000004ae025b142d38383239393530343539323032303732363038000000000850f68e13343932333031333035353431373939313434350000000009d36de7142d3532393332363834313330353131393230313800000000037ca1461334393534383734333831393635393437363037000000000466e3131336303635363339343039393130353734393432000000000485f3d3142d373038363433313633343334323237353832370000000005428d0e142d353637343130313639393637353338353930320000000004658862142d32383837393933333836373434353030323631000000000b59e59413363831393136343936353437313032363638380000000009638905133430323738383835323837383830363332383900000000020e1396123236333936343938323833303632353931300000000000b41d27133437333836353735313932373635393739303100000000011af7f4133733363733343932323331383339383932373700000000066db9d713323834303131353535323332343636373238350000000005c26856142d353237363232393634393436373436343736370000000004ab93ca13373534383934363134343335323038343837340000000006090c80142d373430313237313234373832353336303433320000000004bfcb08142d37343134373637313234373634343330343632000000000a9480661332353534313630323833353138393635333435000000000564e60a133737363838393538363835313838353539353700000000096f9c8c142d3635383034323835333730343139373333383400000000055a2e02123531343136323538313338363339303539350000000000fde66c13323530373835373336343738393632353232340000000005bda5d3142d39323035333230333633323931313236383932000000000624b79d142d3131313538343836313332353830383839303400000000093ec0381332333238383939313432383739313237313639000000000bebc20013323631313939363132313537313138393630390000000007d809e613323933303332393030313936303936393734360000000005252c4f13353939333935393634353730303935353736380000000002144989142d353338363532363034373030373133353830300000000007c650b313333931323234343436303730363131313432340000000009c3ac6c142d34343333353338303833393539323834303336000000000069c623142d38393336353631383737303131323231393138000000000b7a70b113363736343931373130313330313335353237310000000000cc9031142d363835333833333332383031383537363331330000000009e2a3591338383835383936363034363038363137333136000000000879d929132d3332353937363432373732303434373338360000000005af0456142d373937353234373133323033393436373735360000000000e9bf6c13323935383030323437393233303034353530360000000005ba81ee132d33373339303937393737373939353832373100000000002df534142d3438323039353533383732323937303137303600000000068578b0142d37343338343833333636363638303934313730000000000a97cac51338353733343736333237303235343335313234000000000634738113383038353836323630303833343636373832310000000006b22fba142d3439393732303333323938333039353432393400000000046cf84013323136343337303130353136343737383834310000000000f4cce913363938303533363238333735353635393535390000000002205ef313343533383832343435343131363331343237380000000004d207c91332323930353038323937363634393531323632000000000019547613313531383236303630303435333434343339370000000004b576ef1331303231343539383238313539343839343439000000000265275413343036343130343933353939303039313231330000000000ff7fff142d323833393237383234333633343931383534350000000003bc64e8133734343636363033363834393036323931323800000000098cc71010323834333633363338323933353735330000000009cef6c713333133393139303136343133363536383837340000000009c5033f13313432393438353932303138333237343639300000000008d0795213313636353233303136373830343530343439350000000002a4612d12393436313133393739383138333637313938000000000abdf287142d3734343938353437393430343034333231353400000000074b8f84133632333433363833393134383538353638363100000000015a518e142d383635393132373033313130343033383139310000000005a12b331335313935363034313732343934323235383536000000000782face133931343330373832363936373734313635323700000000062d04f3132d38373833323037343637313734373937393600000000029f6c01133430353732313337313130353135333732373600000000024f7cfb142d3733393436353531323431373533373730373500000000091e3eb6142d37393734363834333239373031343531363838000000000769446b133730323634323239363638353135383434373700000000080d62b4142d393035373635383831353039343032353831380000000002c353f8142d383231313433333234383732373634303630320000000001237985142d373533303839343337373636323631393838320000000000051144142d313235373731383430383435323431373632380000000000ff1d16142d32313130363930393536363230363638353037000000000b79478513393135313537363739353035363831333239350000000000cd1c88133732363139383631303237343133333636343400000000000b352f142d3330313032323433393733383133383130303000000000095e077c142d3139373838333139323533313736343235363900000000092c0ae1142d3438343830353631343431333335363235343200000000057003f8142d37323831303031303438343834303839363634000000000aeddae5142d3836323937353939343036393337313332323800000000026fd849123539353035333632353038373339323633360000000008816891142d3235313230333636393238303236333733313500000000024eb28813363931303634333736373437303933343739350000000000a8ab4513343739393734393235303239363338393837390000000001220d48142d31373037393835363736343839303437343334000000000684482cfda712409f60ed0ead63514f08c193d9ecdfa44f63226fb3f15f09ceabb536957fe36d9c4e57d39b772dd76a95b88430359af62158dd139cc00ef50d6dadcdb0478a09ea031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be001600141738d1ee1416f875a6545603e6f5bab4318d5c5b0000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600144218e1246f8baec108a1c85d2f170278369af9690000000000000000ffffffff006b000000160014def833f440a75687e6eb691f41c6b0de80d3de6c000000000000000500000064000000c8",
+  "accept" : "a71cadb45c25a5e7971ee0896700c95b6a9f3dafb800d242001e505692d6e981a74e0000000005f5e100033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c0001600141bb6a99ecbd727e725885b827734af54ace23a9b0001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014efa7d610bc52476d35f6c9fcbcb66953caa775520000000000000000ffffffff006b000000160014df45472d3a477b578b4ef6c6211f95011eeb3222fda716fd3f48003936aea56e91c7c331983de67eb50d02b170790b31104a17a8073957b16caaa3a06bccc829f63e824e71c2cc8203370280d374315f3c1e1227ae480949120b64002bd5da70e508e709fcd4838c7827c8c53d6c0c80be4beb019c9f7624b6df5bf227ba29a8778754f77939cfe534dc7baca5a008b36f1630fa779e9d7d799a18d0f90f73b91a7546ae77d1e0f77828939b9a13869890cb606a57a99bb3ba68197c01fdf3d675f97c8316198f50ada2d6331f1c5362fe7964a0c1a223af0db1c8b579e148ea2255d367a9a9678326922ac535dd61f8a68298c6cf3e1a679c89d07ea800cf3bb4ac5e0ea24d067231f86a0d5610b0850b083226b99804d68f3388fb4a7f21ed24d4cb66b8d4f70656bd304dd0e073ef510f72f591a1a0a9ad5d0c145183069e55c1dab2f8b6afb7fc04bcd00376e5a90e7e980de491355352039b4630fe01e06b3062ec95b2450e275344ac4e62f116d8d6020dbbcc2aea1518f708bf856b42c2de1d3e5842792e278e76ad7a7e9d3f27642229d43cc0295ed8587909852601aade5255c48a5aba9a7469a9389ab60e356bb912691178e80f905310c4ca70cf486044055a685cf46d42d1890f2eee620a98d5d3c70b92b848b213b2044751bff06841af5896d66095be56b5ff0413a70ba6e258b668add2a9fbfad98b6b04fe01b248a40a4ea3c532262e91e8559e0e505a2cd68c074682d5565146a6cd6246c1e3cddfd4474fb2e9b4801960c097e1d31029b37b3c4a3d4742b7d42256497ec9010b2a773d906e0b22f5bd93bcb5cea0847de470bd8f7b014e1c37114214712e6d0dc6869078d215a7e875a9488ec7e6a33893df096e6e4097bc65183fe96357cf94ac71bc957bda862e7636f91ec510b96f0e81961856ff65272881527685ac9400eaafee0661f0aa174b7defb54d2f9fd2b34b67980806ecb546e62867a90dc81ab70ba2b562396a6c8726c659ae284d71d83a87097ec40773a301e7ee25e0ae65014ef9abf2acb651a1a87d658421787927eed6a7b8723b05b100fd382bdd6b0762389fef528257a2761d15a83926619e6b733a439c8b67d4cda5e0ec43e2d7493503a0a1e548efe6fa48aa0dd391b661c016d69253a245ded359f612affc40b5ff01a3cc2a60bb3fd549d243a206460b6504e7b8f98e27c13c5811bf248ae016e101f0773473a5346a999e4856cfbff911ee567e17399c0c5860fb33edec584c1afd00ed88231fd9b2d795341ac3846f75f0efd3757eb839886086dfcefb32a7672e5f683525dba503c5a4f8c846efb586750c35b14bba523adbd77281af50ad2bcc1848730609a3a68f360ec3ff4eac9edd51436d93738244a4a542c37fb18ce0530201d4c580997b83fa19facc737108476c4b50cf0ccdaf74b104165ba87de2b779d2cadf535695ac7ec302e7dcca1664aa3bf7e6e1f5f8b3009322524996316c08160021998a5e7c9cdb0706480d93a40941eafb70384c81f138d042ca8bc9384df3620f4749ae9b43bdfd31bbcbc8340d5778786f9d5b24108c4f8fff45f16396cc7d3b82c32b8d89a07f6159f67751659790c8efe953a9c363798b1fec9593355928003303d3f720f5355b40320ebb9b14c4d6eea0359e5ae33952cba80b885db83e69e48519cf7498a34817835e43e020b4c8839867c23b52b100bd134ab3659afa93014019660207ab07125967f2497dbefdfef0025be3be92459cff96ede226b97df9fb398a8e3874d221f4c90d19afd4c517f331cd9f69f04c8eb0b09cf46ff32c4c43a3e738bdf5394b8e07540bc61576e84e5714ef8c77b5b274683de3d0cfb47a014b8f05bdec71fbf2d41883b92239edbece20ab3536b3a7fff461a236323619a7f7e1057cf96aa089c720c2f671235bb20b8a17c7794f1798519f238f3b29d57400a8fbd16abaa822c9f3b9c0cf277c46930a1f9314ab6afdfa7691873bc73b4d17cb5f8ddc932ac436026f299451f178f1a2f64ca2403d173cb9a663ad59d17a0496b72b5dd81326b05cc79661e927ad678d545d0390be21c76feded4bbc7f820e001ebd928a34748f856fb2c7c084459f4455cdacf6484db857e2caa0907523d74118d3f7a7e8d03d3184de7cd174fc1b65c52d26d9ce9291e97e963af185afb55b00d41c7832f96ca23d30289954b64dc2902e047b66f864e2b7e7390c7b2a4b13e060b82ff60a42f858eeb22ca31e7e808aac6ae7944ee895d044462a9c782a16e5dceb63058489db069fb48db4257fa392a678000d2bca4057ec794fe8be7629f301c1fcbe6f1d6b61677de82b9036306e6521c0064cadfe4044c9c6bd4648b2e9bbc369162625d93855adc2b0d691721e69c1098e6028b550d76abbb0357c724f5301b26f92b72c4ce0164ff3ea43c4f4e8ed1e738d0553d5c297065f1ba6841b5ea552748ea13d6e9cd00a94e584bf387771df670f6ce3353115f75c7b102d06c371b930659e35071c08d3a4e99714833254e823c2bbabe14180963a4fd59046b38d00463b5f71dfdd51437f02ef60786fce5f5e666c6bb5dc904fadd3775bf5523b5e321ccba14e00d96bbe0c55337003d25456bf11956cf3eedc64004e64ac52d2e501b6634c97af43e0dff314cc57f3e1b32b01e3a8795a903221e56e866a628d5c4c65b2edcc3b6e0dee067af9fffd62d183c663296de557ad521f5e1175afb44a687309e0a55f23d57e054df9075a90178a16ad7ea5919e19497f82a7907ce96e7200fdbba6cd3b590008f41aede53ae3d25ad2885c40e3db8455ed50da21066d54c0aedebb44e7412f497dadf979e2bad440c8e485cb118d321aeb145e8e9f0718f101fed912bcb1fac738ac714d5f6a0035713db25e698db002a381a92866f9f7ea5cd8923e155fa313b9e6d66b8ba048651976c29ff5208f2617494dc4bf8acf99b3556f6f2fe3721818e50241c587f498f8dc979abb638f6dbed8595e0754d611160058265c34ffd073d7807904d2d4aa220e1c7be0439ece51ffed15b9e6f66d79fc17999ed667186b81b4379a535d5a3ab7f2d3034753d09d0054464af8714e8bff00ab83e1a65e8b37e5265efdb4cd3cff7c88f55ac5c6095c48d33b08798f8e1ed586501c1ef5416a8ba3cee14711c6d333583eabc16b8c5be03ee08ae15388022b182b90d3e6eb2abd7f048e08f1e797299457d509786b1c35aaa33659cbe315450137b5264d24a06de27f88786d000bad88b65c89c384a30801396e06a5a67babeea9629c4bcdd1c051555e49e3ee4601c6f0bb36356b2ac8b4f2ea7d824a0e2f420012ed24a8f0f9ad1412d9296333d751c99bfe3a22a236266a208df6c203efe58ce543bae47309711194c9d6b7dae89e9e176de0be8656dde64a94faa6ec8d28b86381b7dca0d16d892852b63dfe68627680950cfa3732e60b1adfcb5d322aaa2301ba448b69a2336d040e9702239ab75e43376dfb3bd974738c0a23ade67db64aa5c9d4b27a07e9ed0e1d5518694c9a9c0b267f83c0616f4b3b4177ee442f84aa05000e480f078f8c87e86c520970beb5687984cca932978aad6335418616c11c1ececc02084fea64d5732db3b8e1419cd1a271f1ae4ea584e52d023070f974db24ec763e511bab73b8bc472910caaa4d398c2402386958266e1a0c9f09b962a5e9c90115a4e410c763fe24435ee2854682b233357bb6f7152f8bde28873e45c326977a2f2af39fc5cb1edb2385e649268651f52c2f8c5604438f4d278dc01f8de8fd2c00de649e867afdaf381363fd1d2c1fc6c50200e5b3a2148239989e4ce9c8ec669d486310c2837209e61382c61051598cef2030e462c7aca4da9f932e14bbd629fd981149d91512f5edd2633aee8e93e06d04d66571d20f872f1b5055353093f98c01d7148b3fb03ca828f98e3ee403996fe853bebd7fff79e8135403a2b4d38f93346634833ee45faf0d8f19de7fd3dc735bb44fb6f3befa5c23cae1e3fd5db657280025e722506ecd4ae1c6a1c7b8ae2dc4b868556b64f69b2a22ca9ec9041c2183c8ed0df12298cbcc57d65116605b25565bd365b86e6a74eddb32d5458ae519e65f324a4adcf0b304959184eb0b0ea8a06206629fafd13f4839acc64f76938f2ea3003da36e7be6c0e0a017105401f165c6472b5db08998f13cdd926b362ee2b5419735fa935c52acfebba377abe3177343de3e643b36cbd06f114e72c7ae522b71060006d2b3e2e70f6e53ea1db4a0e89406b790b8fe920360e2a3e2b66216b602635f6d6b998cf774bc6d5a69ed9634e594bf2109f22b5ec6782d7a6b45f7cef94364693dfe9ce28c74a03a4e4c02fd8442eb1697ead7a3ab5e637b813fd47ba5714d0143ff4018174fc45f9c38a0e54072fc70563501af75d4f6087f963f158b42fda27a8b51ce3440293900adda20b364102fda1c304ea11610f00b75dd1a933bfcc301bb869ed1d5897706e091756f0eeb8f8c3a3e8f715d90eeba238ea4d709ce33769893ac7d9c41255e306247f0173fd42efe1e51acac3d69c7c4ee82ac023fd9228ba9b07e044cb749ffbfd1b749ffcf6ef4eedc18ebd98473eb751143997eefd4004c77503ef7d5575fb2844549899993e14513234beacd2a71cc5c472d64675341129d8566e1c2ecd6fe7ce1587bf265666e1adb409b2cd4d39b217ef00a3fc22901b033141cc6320192ce7eec7b79f48481fa80b25a0bccb9831655e1243608f2515f90e1ecba4327f34b2a211a11389736ff27d403a11aa7df4d17979d0abfc9e9f136fe790d1d6e59e7f3fa97f3ea35ec6537f66dbda17939329ba9b09bd86441014749972517ac23d4e0001a08a4c3f840267217b1860f964ba2cd5ad68372a48748add779d3fa42e90048043c84557e8735a16894dd13ad3171d7b593ab94ca6201a19278e19e4d116b2db423239cbf52d30d7719e83b38c06c6cda7b4ff5d27a3ddc7318ca0b114aec056f222154ed5183d313c29ae0b48f50313124eaa0936d62d029177054d02338cb8ba19d4852d10f294b3b22aa737b5f778fb6223672e871000c091967e05ef4147b08f6a29e4becd54394155d80a1f73945bcd8986540751adbb4d5532ff5973f643f4c6cdd8516cfa4032a0a22be790018f684216e32d198007acc906e3dcb9a5de032ebf8081c2fd4e9a5b4c205d6b66849f2f18f847094183ca792543fda1485a147e48329bfa61ef236776b19cb9941a74db07c0e2aa818077b58620f61ea9d6647e0d7cbf6d9e91912f70acdd817bcd40702af78134a0701563fdd9be64175b6e12d4671c05940025c620b0e01e129bc34ca0b25233897ff69fd6bdb024dcfd617e89bfc00659e3c38e2992932e5c7846ce0cb04c92b298e004c11c373a0e28a30535f2e62800011ac6ff73c8e75c22afa71e5e9afd665fdc493b509854d46e33c63be2a1e4bee978718b4468f9d938cd504044e7cfde394c267f1ee5c1e62a0854e1f818270234bd48023d4fdc76cb69a16f26dd4bb293f4801083c7e0ca1add497016c4b48082f1f7338d3fbc5d20bee61eb077895459c3fb1157baa9801632c634770ff9d581b4d7ccb3eed0dc1b5098f5010b4c28134b0020124881b68954d7ba4754be314829567d04347372b138b92f8348744668de4cafc20740fba48daf48868360e65b53789f36a41cb3c0726d2c29641062206502e91eee94b346126e717ed6c9718a1ecbac58ebe58b7b96f7b3aaae9bcf24ad0a9ce0141432c4a7a54c6c1374ff601a3669240b7dae0dd93a6a0ee51c60c079b5e7ed4cf69d2815512d14ae5f807a69adc87b7768f08ee2250588cb7c7f1ed7a2490080151b0a7611086c7a505d57949a8241fbd7c8119c04e0e2daea5da7f517a98867b698709aa04b94e3b590f74000912043a7533c97a86be5d54c59da106a05e4ec50712b44ce74305f81de896082e17c7e1564d2aa8f4dd386483f7cca721bb748b0035dcb7e44312d333ce2f5551bd5049d034438387778d2b1034e4533b21bbb292dda43e892f230c2a79390de6754c692f6ef5fbd47d08d08caeaae7a0a6a895ec00ca26fd1c1dcefa03f07d9dab072552946e00db41f6da7f0b3c3e2240c42beaf8c0924803ce4582498cf57598b4ad99a8168ec06824f2503b31f3b2a514b2a6ed41e570b41050adca5b5f597e7200a948c007cd74eec8997c82f24f7a6456d38000208e6bdfc404bcf45dad8f0af2dece65d9e7afb3d5278ef4a6efa0ccadcf64625e42680141086abaf26655cd5f1c6abe3c77c9e0d4301b7d0bc69fa93d32d6cf01feaf54541a296108c19bf1bdb6adf238f96d4505f79309f9cbbe03775fcb859ccd36a6ca301b2c51fce4c74ee7a6d8bbb1a92fbb153cc9e3675deffbee9edd9ccf5be9fa933175ec651d6a9c3100e60a63b44f7348516c04404fba706c8be29b00ffcdca1da3c7eb14b94bf81afa94b3f3dabb1e5c2c1c372025832e1be6c6486e08bbd93c6fe608982a5b2b1e7fa8372a36897f2bfdad00b9ffa72df21cb67b2a0193b1d906026642fc4b482091eea7ecd6463b32a587f98877eda46393f192f73ef466b15e4865ecb5046d69f5b1c45f94911e784dcd5864749f65ba103ee395e87f1b4ffd4e2736f7e24780e2fae6285e59b8e6532d72cebd6706894d110e595800351f77ee3df36f0ce6c240bae7ca7a84549155627be7339bda2db3f204ae5c9580b22b833dac6b804e2e75813d17050b9409f33d9c294143e86313bc93bdc5820152aa8b621eee8e27f7e71d3ad0ba428dd6e92f78ab4d516581e582181803dac398adb7b4d99be772fefb561075a9756c2ec060df970e22c1c6234d863b3b12eee14466b47e4ee3ca783f31be154454ea0a0442f9c9583f415ecd4132ce070460003d03ed58dd9ee87ec97092f5392ca5af8010e2dec2f2301ede0e9faf2d5e4834203d884e9bf825f128a05b5e64921c0aea172e2c31883e5c18cbda73706cdafa019dc06aeb731a83442ab4a9499fce36fc6b35fcd48cb80acb62949248ab7359c3a89fa6758eedf24a305bcf9a1a266e59017eba258ff5a6d3685542380180f04000b1909c0d9753eca96190e41ef63ca19a7e1dcabbc5f991eb1821f81d180b0d0148ad13d904a5fc5d17df56b049d38708a163e75086c14b4a4868a605e44cb1b3f4d4e55a698c8c154ee0825436b4355ac1e8164159753af3b6e47456ca7bedf700a41644a745a845377146f959ebe25437a8f2a333ab8728d7e95243af4ced57cb94574bf20d4aa417a4dadd8b16b3a24120f002445543ff8c359320f5095c77fbc47756b2b05d8c414c2b1d84edf0954e03183689783e88abd3b6edd806d7dd2501765852d6165d0f2cb20a9b80fc793580eabf5b03a3fc8f5bdbb3e9d1658c003dfbf11564bd5fd078c2eca23a6c4370065c908ccecb2dc3c09aa851668582ff3a0013b151199933f468fe03877c08ffd79fb874a6539319155a26581985e226b636b4368e191c0daa05100701eadc9c0feda26ddf7a172ca2600291fcd218c7daad7b212a9a6d3ef8625e0b1049e48f192aca62d5b7fe2113ec53180030c9c00d8d0052602e2ec9b6505deadad41a35509497716ac97d952ffc0802117a43699191ca60b822b764bec55dcd978b0d552bb1d264fda182404313aeda7e5cb911e5e25500b885a1190d1659f91087b4470ce8d8a0ca346030b690fac573fad5ab8864653a3b98c26d6abb5e7b372f1671b1cebada4e0614c9c98045666064f5c6f75b33d2b76b9912fbb941fa9cee37d32b73b2bc0068fc5b3f8ba670c72b6cc98340677f00598de3f1f9e925d3f3151217e6150a57eff0535a71f1107deb99c55736b53af7adadd8d9395c5b4de14b0b132880614ddbef41ec92bb22cd8466766fedcab3ba00f09a9401c0a1527b01f8c07479b4f8c77e58f5c9c68f7265280825020647d4f36a6c5d1743325826ecc08f5f54ded1b572802daedcfa08a276f2828ffad47848fe7efe0601fcd3e6d1da7a2f3af5cd639e8a8adf9ff948dd679865f0340d7b4f00e58d038901dbbc21e56400bc66dce660a80add2cc8c43a52e4d0d02858147901da42c71d0d105191ea0590a95b17de600b30a0a3bf9ced41c9287912add4052301bc366ad754916b912e5ddcba0f473d6526fce2b35bfc74130aa8f83b2fda24d8a85924a0926490841c04b9c7686c577a63e8e3f4617e9c3d7f73c96a6024f91a1e64de95bc7b3d4cce9f21b29cc1e1891882418039e7a4b650d45d1a7e3949fe016a0d1aad4500d30abefc4bd8b4afecca95578b334271479cde05e842e9bf879267517d534fc79a7893dee9434c441f02b93b698ad22410f5e0038d0cdfa162f200e543ab8758245209717c3c81c5c142c9fda13ca338a51dc75e3c38d10fbe808800b0ee1036f70446c6f1167fa6df1dcc3b2886d48e8f1ce1757a92aaef1b70c18d15b3c220a1424e358bc1af48eea94d7381fdd91ee68e90b602ba9751a28f45002a685540ce522b9a993c1e5edee59b8094c428d19c6e1321de26a3908dfa60aa0814ffc4cac900060d09c8d71502af41e9935e599964874892716269fcd8ec96005e41e7fda6ce439171ea8ff5925da15fce044e082b3d7a91f79ad3d7aa1bcbbfc64f0d09637b8cb4d618821fad9bcaadd2efa1a4df554a1b9dc80cde0bb8f85f0f3e74b56a9807f2404d73568890e1d0fe7133ac878a2cf2dfbbaa0cc9f55a5a0163fb8dcbe9a025388982224e5a2afba90f220e89d75047f36e3e660a9075595e2167dc451f3a2f6fe8d8448d06f18096a4aa00dc14786f0c2d70da487e0358290082358e9c3b8b427f1c424af5d8491eb18ebdaaccc0c6bc06ee914a21f5ef579af6ad5f8d3be26a78e9eac7b74cf5f4b490c83312efdd5234a54c83a5de8e365379c0b1b78eca1146875a32552029acbd5eb46a32dd38ceae1d46f9851e891d09015a6852aab6ef959ca3b4c46c6721c9a69fedb15a92e74b467dd60cd9fdb0e1103df8f2909f6195ffe1a1b89f11b657a1c2a7c3918fcb8e96ed877c3ab23c017100d0bd00a64f9076dbd984e08fa4c3ef5d5513b41ed1d7ab88a520066b68ed30edefa67acf31e5f844012715eea73874f509f01c548a8e4e7390c056e2fd8f59a75e7632f1ce54411768511e761b92088428abf04156d826d94bc007bb75a7be6500984efec62feeb2b1b45066ee3880b9cf88bc9ecc77569167a0d2b8b7f7a65fe16db2c7ef8149547c53966a3da933414533847d862e18f864aa9f728a7ebfc3bf00cdf190894e430a8992d357a1a8f6a532f5a6ee13946d3488f7c31b9d8c23dea356f3c8db38edf7d3c7081680ad5ae188218e8c7aa874304c9b16832fadc6db659fd5a6a38e2120fe543657773487e8816d566b7e8ca2e6f7fdb47e457b29ca7500519ca0d34b3fc653480ef9f87a02809d3542ea901cbd73a178db70182a5874be2b83826a059cc007cabb4775954ae23ebd439e7fd642107f193a40ecede4b04a0059e7745d0ae4055ca7e54482e97bb24d6d078034aebe9191f113a02d34031eb21c6621f89ccb8f6ebd0df9b21c0dd0b6e9b576bd508643ddfad9b8e5668a24cda38bb7763a8d873e24ad8c8f8230f41af95544820f7abcb6b32720fb20ffb8a201cae4422d485b36e38c6fc088cd7f3e161875451c62360dd5c02820c21293fc430a0620314d01c9f206942b6fe5a3244f14f6e19975d3407b56c1c48ac63e8a12014a5b0f039e84732a90d7b8f64d2a1680d7d651ef97f8f97b7c83330b3fef80b3b9ad44ab6d55b37d02ef19ac0341abc64b1855f35ffbd287d0dc8258e402c09cbb5a29ecd8e592a33f87c6d130fbd849ebc723ab08a57c062b2baa7bacf30f13004a628e6dff564bd99eeab40c677b25b17cb75d01d95e10ef5d44be98f1a97aac1f1e8ae59f2697bb1df9e1d10744b33af40d2256db0cc5025f89849654f79c18006bd2cc6109116002e09cce670b578be05fa5ce74ffe455f4f7fbf42ad2f0246dd7f6492c2c6421b0c32a124aec68c42aba60e43378a8fa398e16ce91b85ac0de38cc75af53b496f5db26c99e3baa8b97e9bbc5992f669fed7249b85e7e9cd1890060cf6f284a60b84d2777ca379325e7c1f7a223a9113cee81561768a5e5c84129a38820b7c1dbd90a515b2efc96ee8c5ee7a4da89e400c0a748583e0b27e57109018d0a9408c127af01fb48d5a60655e915b1deff223d83512c51b3c07595420d1e1bf9f37110d24194a17fb87d17f51df4de1685480ca3c0cf7c966bb65e2506cc34213cd51d2a9d7285eff1b978373114f6587c6629eebeb56e50d6129b62b9ec00312a9298664c0a8775ab50f47970cea30aa80eaa34cae0f558ea424af1afc23fb0a4ba84224b3fa91a2ca5a4b57df14c3f36a7d897fae7a9c821f07ed36fdfb300fb310a664eb21d06a2c1523a4e9bc240a4a9c64b17e77ae9f5d4fcf81e41e69bbf8bfa0c68beb9b273f28cfb172ea795d0a5dcd790375850045d9c98c9cb36d6d14cf231fd40d1477cb2f0211556f3ee6d7b356b04786e2654566668ce6d11910040165fff4f2f50b85745ce11d429d5a19904ba8caa3c728bb0eb9c1dd644f68c2ef87f0025234c129bacc4a779a20584cd1918ee137a54b3f2652fd2538ed1e7012d12254d3868064842bfec4b08ba2e48c140867573c59167195848bd284a45ea2ec0655e9a09ea0b8ad0d833f3457052fadddc22a1a06da7372dfad3a6ba472bdbad362d321892b5c21018450ab43c99814e08315f3a5e170713b195e5fbfad1014c6d3778d4fc502d49088c6b06fcaef0ba404c79390dca753d577b4a208fbd1703db78992e7abdacd68e76c5f7a3ab95c03175215b889927cf3a392211e95a20015adb0b785836a786bab57eed6de2f20981ddc9a01c6e46d596a2eb99549cd3e444ad647f9a23d041e4604f933467b91a21154979630d495da5c75b84112f36b5076d477fb96ef79238316d92267b86e618ccf8b3a0120c7b70d8c7985e5af49201d2158f579d2e325dd8ea2fbabfc3abe56c9e541b3a7c8cd4f5b496a18c4ab55912afc6b9701204e823053ae48c2d35267af2502d07ab7c01be8bf43d66c2b3e9013e982127763567a6f283581145daf9c2cead634d01e19121707c4c2e0d6e4301ff4f7082b265cfe857fd7913358c3baac958ec61db47fb75fb8b801a2ef2590ac87076ba03d697509d284e78d34a15d04615756a2b067446d81b9ffd37c6630b01fb8a40b451a31aaddbbce0a6c98dae005e7b19518e42f28833c2b8f94e336f53342db5ccd14db9747b08928975b973900fb2a4c9ed3aeace736c42468c6c4a2500608075e049de78acba1037b9660aa354cb4f51c31d1233c5abb591c29c0508cb586a35d9cd0fe29805ce96db124fb59c255ffa84d749a8a4ad04044b25bc141337559acc188cba3dcaf2d1afd432a77b9f83166838680273759352731e76dcb20155285ea3eef98d22d2f6dd486823e8cdc345a97cfe8284544342bd988772a766a0140d7eaa22710cd9c1364c7795def29973f28f1ef5761dac820ae040d6068c00e9a9f45cf27b74dbbf3445d0240840398b303b073068e90f1121d29c1515c1fd1c2a6756ee513d6613d5eb97c99d39e507730175154b3003bc7b8646a12e56a40e616c2d11d71530efebfa8e11ce83721a90c8789c1318fd7c4eb2de31b10f62013b898d29b5c1c58a8a47665c15ae97e162e399ec553b2324bfe38bb8b93d3c036cc9444569943751778b097a3d5c9f357b40ad9cd79a321bc0c52afeb3ded34e000eb5813bce906a1d89f401a12d424956e183f5bf2ef75e961b586317ecb66986ccd4d00ebb946b511fa7de586d01d7f8cddb70101d93392c58c2399e02a08aba21a3068aede164f70bc656ce1327424bef1cb6e2ea54897a83c647c1cbcd9af50088e7c72388063f7f18de37beacfce4ff37d484f4216d6146aede57804fe6581a08808b30b5e58e9164600cfdf8f802ad75ca84a6a91db886149408504ca6832b01cb51036a6110f0570464d329a075436664074c9eb6eae7180caf6ced913992bda059c119c7a64b1bae609c902089f0aea4182c617cac04c443c1ecc6b3a07bd736e77294016a1a22c9a4fddb6eb896c01f5718e452bb4cc101e0d983f576730d006c7185f7d5e520e98734ba906600a02c8ea7a8edd55ac90a0f0d9c0c6ac438f97409116a625689c67efbf15693021e3fcf0bdc14b2160ab040c4d3e8722a3cdd009bde9a459ce59cd11b0664ba66da26cbfab18b8fa14f300c7c7794b492c6b84655127058324a05501fe684aa03da83bc6d6c825d6a79e2c59ec0689b12386c68f6bf3c611185f4bd91fce9f0004cfbd94053f4be3ddb2c322dbfbefc370b2066007feca84cfef1d6d3ce2f7010396f575697dfc7129d49671710afd6fbdc6b9194b72edad311eb8012fa4bf1c6bf109ec2f40a761bfefe1999e7fba1ebf99d0e9d01d985d855594b8dd6d527f504b7a617565d545fc41e9f3692e7d27e0741ed0ab299f6bc64db9ef1c30e7bc0dde6740de67556a786c02ddf29757ca64b8b776b874a57b6dbd543632b7b770fb9ebada1e82c1253e2bec8c81499978029da0ced5a012ffbc4e2994fcc394acbd9293c2bf0d8866db90cc4e8ce05c35177a45db8b2007f36acbf009582f72ba1adef6a121d3c010ec90af145e07799b5ea39b3d7e9c400a2441bc5e39a1fa762e17a4dca83d3e46228be53c7a5afab5bcf4e90584b3562aba96431f26b70b42ee290d7e307a9d6bf599a1e03d00dd983708d17bf23f6b0d766a7b0944049b6322ae9476c19175105839a3888e4a5533d052b69488a30a100883acd4f11ac15284ed831387849aa6b37b63d29d58b674f841019ba792da8202d61e1c53d89cc69dd133f5cb4067ae4f66af58cf4486709f2ba0aa6f3f5f60600785cd2c8d1a230d63429f196b4464e2425386de67163014d4259b078aa3d1b8db9db9afd5de7a386e9a9838ebdeaf440e983920c90492dd552c571a91fd4bd9184aa47f4b60cccaee41284f4a1ac211a550a55dadbea334cd94287444f552f640093bce36435b6d3d6ae0e24d3248cbeacd7eb67299423820459837442d3fa1a26606ed4357767ac3a96056f7eb546df32b3f045029276b3ab98a77aac61ea7480002231a8138f17dc590ff6e19b295e74d20969dc159da7e1d4c5654ea166c13cb047de108fd1def2312a814977eb5fb5820e8cb1597d77d371b2347ce7d33bc0b286fbd1a7d84a5265d9b45e1d47746f6daa2877c65d3e274ff6017fe300ddbfb100feadf4a5e143d37ab12746f3739230fad962c95d771f3645336888681c2dbd56c38020d60770535dfbb25f39ba18235be2d7537f88bfad1bad28d43f8b13814f00f2c1f493e4510c3da44f02bd4d3f710839bdda7f780494ea4fe06cb884cd09eb68fa73386467d992d55e703bc77ee879df26e8a8b226b9be8ddfaf8ecb51aeb0a3c96eb0ba456db716afbe1597935bf0c56aed24b1dbdd1afd6ed89f5a775aaf0016327fbcefda868f182f86b8694d04f5051a2f0c45bc7d8ee34084bd2db05da6ea9f86d726cbc604c929009dca6cc862f1b9bd0e9d87f2bcdbbd0ba4ebf5017301460c6ed886edd55343dd0ba4eb4821bddf25d07b79b431cc764535549ee388e1d808694a9dc44f3d4f936dc59bf064f91fdc0fdd14643c25fe15aace7e1900ba6f3777d0dad50426880c015d41ed637a8898bf164a1587cc9190923be5dfe6220152fd19df70163b2552115f2915a96f7721d65c4eae4ae14ca5d784611bbf5baf420d9c1d04a54be0899e2cfe042e3c16d6ac130d4e3a6e741c04750c4af04b7e01362abfbcedd87aeb6d6d5d66b6ee0543f1e3fdae79b042e0f7330e4210de1937ad11903cc26a21102796a278b7aaaf26f32f275dcec2033e6e1b3a11a4b27a901931bea18a09a6523c97c0aa9b70f95b7c8c7fd84f7a8f0e20b4dca8fc6a9db7001059afed7952d5ad489974b4c479eaecc2db4bdae5a5afe151b131f83516ac2f90da67ef23cae617378c4e2963805cd4ba94d0785698c703adcb33d2c279d0b301252311416ff660992e8eeccd71ed374a1f23cb4b59482a3a352d613f08504a4367f942cd95519141ffe1a5155bb7cca7a38106c9b2f0435312a98828870fb29176cd43c3e83e5b8c64884039ba3b58b56f04fe24b57f61dfa9941c58f077a6860128e21b24b7cc6cea9ff261733401bcd9e48a108af3e34993d48df8a8164221a017c49ed816411201a526262e793d9abfc9b967d8211eed635ec4692061e8dd2e0161432fe2d85a6df8aa97a54c9067ecc7e362749ebbdcad9a5122b5699ca200643aff1573eb2032eea301800ed79f05c80d9fd219005626555d01379a09f29fc79341695d2164c42a93502a6bf152fbff3d162ec844573c98fd1e7dcbf96707a10010777df89b4ce0d0a42ea79458def98047a6efc9e47d20f5a9cecb063d7403be5872960ab79ce9d1cdd0fbd45c4249b9cb0ee50d7e19a0d58ec3fcb7196e3e1a012d219229c8efc6c45dc6c5d885781df685212355e929886233b74897dbd50dfe781cb9e2b0f2e19821aa52a5554ea3f2719b06c19087b2331181ad68ed1b23d2262a575c69588dbb435fdf8e2688285fb6cda07d173608aa11d6053a0f6a508a0041e8edb210d8f12588d3266107ac8d9f5c7cc1a8bfd23aa8a24abeffc6ebeed288a72dab48307be1b8928809f09b0a30fc7f3480970ad583e1252e018b136a6f0110fad2ba907648eb0c56e4348957e9dcd65de604973a13c340d36a4c0558dac51fc904d76810dbc6e46ddbd9163dc1a3af949d960896be5a121ed96291d7b3f86c40c9971393bcd39371fd99dc6120a4a47a4866a8b7b7864e39b7b5da7aa07e007ad6d25decb60464606ac2494093b1b3abd7705b96b7dec1b73c318d5c3aa222fba100ec2e48c3cb5cdbcb359341fab8c618c3d1244cfead4e8b78aca993529600586f470819c425d48dccc7462e9dfb3ba7aad6faf73d1b36f6727cfd3cca7282a5e5d3e7f565d12cfd5e1fdecdada60b18f5e42fc927b03a5e36bd7c77074ea6a4942ed9c995168aabc8a6796a2654a0be52059b6bb8cd4eb09716ca7e4714da01c9d1fdcaa36c2c04a284c980341c50f27b221e632d5a7122cab0afd688563bdd540c67a7feb430cc7f5aad54e3c2c5b457531fba310b1e7a67066bdeeb5f63d301cd043c4b7e918ad9ba3a3aeb79e5c5cb77b76961e7064ac833f9889fb987f36aa6c3dfaeb4d063ca0d699aabbed4bb160080c1413df6950ea0e8ad692a6584fda557e32374f18a46983be691096c15d32356dfd5f49507ad0a5f58698577b24401de6f9c984dc4fe65b05af2ade6fe14620cde64b44df0e56ee2fed7b8cba168cb3223f0e3df6f1c747c3fee9e2a577c31edeb02e6dc2c4d7f88b4b1b9f4338b8801864099e65bdbca0db945747cfccef85f172ebd183ba454c22326f29fc6549b26e6f4c0efa9b69f9238ed5f92a61b745710ed2e19b4519fcdd246067f29471ce6ef5d2e73dd99cdd779b9df0e20091d6b3689ff106ccac7651794c4c65ccbda8f01dcc914015b672921640b1ba12f45fe5c85b492455f1d894f26414da9793b664a0bad7848ea32b8d2f370284c94a3e0babfc46176d0c54cd15d36d8881bf1d9b501373a96ecdfb3d29b6157b653b7cff329babe6e6f41fb71a66ddffff12954739033a0a7044133ce0e4ec93a11f00a6194d145bc6ac4a1e65e391545dc8962084ddd790e8556356f801a732a3caa41992398a2032a6015eb410eb94d52774a5adc0108df24c3b1a912058794df21cf85c94528a82213c4c1d5bc418ecd31551e79fc86cc7f4ce4eea30004c76d8ad0aed4dcf2adfc14b0ed3ec6653ef88b76e208d600c36ec32c3e0fbdac695b1ca81d6f06f110c96db6c180d23226b59a8cf8a3774b8086485c9314edd485ac500ab15222f8b7c549ac14e04793643d2c5c7d44a71f883c19245fda1076eb599743dfe0dc5387e35df47a7f6c02609f7a57b8da2cc1012ab9c27ae7b6d5eb3bfa7b384b5fafc0933b6eef3e0c9d1f606cbd2da647eb55f1df3c1fa44e744332ed600958ddc92af96e573dd780fca7f2f8f266bc5e396701dc7b61de36a8430e01f2bbe721abd769454c921489bacd78dc427071b0ff7884783ddcbdf0ca55a83ff049d940a36121c624b093cd026020cdef385cdfbe7b4535b9b39447b0c1b5d8940af47026e62e08c722b4a45f411621cb7a256de9425f0007e8924e77d8c471815ddec62e50609cebe9a030f5219978151393b57570b77620b3464a0910774c03bb177dc82cda5e35fd0fc2936092eeb14fd134db5d3d6e001e60e9dff8126e557f26a2659caf2580f1135e4f4ed8abd91c55c4653ceaab48c46ac51e2240172ff0cd3f8851b7a068a31221e47d01d9ee0117f5871f7082e5ffc9443040ef33f032e641a8cb9cbd8f737859c6efaf8fb6b9668db4a286657101b35103be8bf930ae3810f750edd78cf4fa2be7eb24e35b9994f35928ac395c56ea94849c9e7254aedbf0cd0df7ec0a650eb7bcb488f3184a195dd0c98e27f22e01259ea3d2619e8d1f733711843ad489efdc77b08df8fcd3cef0212dc7dc5506d2e20fa30f81eaaee36fa69e54c38163d92cb75d568445ed5010b1c7152388800e0bc6a389cffb2fe039d099c23bc6860a5eec054484e9dd6406ae55f9d4ce8fcd00e97803e6c5828448491447456200069030f3dfb6e708297f4754437059977daef0a30b6ac73652fe099fa4dd0ef061121661d5d1b14c9ddafc72d3e17dd7e80e01a95bb02e3916a0ac5ccea5bfff55bb62c1aef97a413818e76775e8b698112dd994072297cc111020dd430b1bbea43d68e0a8f26badf40489f13c5fcee1e6b1177bdb553487f154ccecb66a933915cc47f2198ccdeabd558ff2be72865d70c10b00eae780e463c856d967b5611abedd5a811766542d3df1b493397bf517cc0b9b84d524401b0fa7598dd326e495788956a3eb55eb802f2181500d6c3267868c0aed016a460bb7fd25d8e654ab2517be8e6645b23720c34bd59895cbe536c66041b48871d2c05dce7f4094880bd7c76820ac13294c36d1ef62a78d8c784ea7248bdec57cf8297854786dd4c9f5981fdf73c5f3c54899b2352d45f2ce443a22558c141f00326fdc6d523b64a2b2c006d4039dbbcdb7672a159dbf92ce2f82632f650515ec369957dc27f767c37712024bf6988fd63b5c7e9d262116dc4f80a9b1864568bd000ce661bcb6678fe9b7ec429f5ea7302c1d07e094f1447110d4fa5907005d415c39034f412ea37c3a3cfc7ee77073a4df6cd3b3c4af9b2ac8c7a552b376d4d8b553492f78d58d53be5d32ec16e4f25245c4bc867259717a6ab58338c7c4fb77c601a257a03d8163d42fedbde93ec0772719db4f7ab9a5a9554d5be1c482ca7df88e61b6434e05dfe5250d2f55a9eeddee5148bcfc8e899ca86792d2cda85475f07700fc33ee9181c30bfd5b0ce7a89ec3261fc4b764674fb5a1d0bedb0754c9dc2fdcde400dbe23eeb3d8947ef06340014d3946b5e207f251c3213514e5adaa4a71a21923518def7da687c29532df029f04279911e14a9bfc28f4746a7281133f75c501a3893d517391155d17fe1608d2f7559b002b3a7b74bc127bdd8beebd60e617845e44f76be5da0c929c7a1d081bd199a2ceaa65407e829146c39917e7424fe5700062934369a84f32540828e69db3d96fc471862c2a5a9d73426ed73ad9d3cd6be59fd3224ad09523d09f00bcfda13a0df889d712d1d81e8fcf14a5be8ec88e305a2a0854b329d58bbcfa606720614bf44c3eb0e1ee83573633329828693d97d3ba0096bc8a778b9f4ef6d4f079a18b780ed6a51628e37406c01a46d0caca478706847e661d479eb30933bc883cca5f88078e60b1e08d59a0cc352d741f8c1c1db00f009d086ae3cc7364d0b1e2e095276cba45eebab239a6f6deca236b0a2c668354cb675a58b4b956534fc54301a5551e1e6e1ffdba6efc09d6ec2ebacba2a767c78bfe5174cf8510f95a51816a5e22285f95725064de54139f4d003f34cc85966aef00a982edd9abe152a4c81c2aed2f04c3ea0fd25d347bcf6d4e3704c7011c5a8c35da5b8b9bbc261723348e5a7bca446a0411d8f72d0c293cb4dd815ad2541b4d0e010ec1f9fcb3f7a1889b4ddcb0456113162fcd24df0f1889013fc1e1954a5ead74aecc9c270c90c2a65a070e1be0f10c015f28f4ce3e713f59c8affba90720f0d9e130e04417680b554a20977be2db5efd6a0d23dafca3eb5bcb736f4f1a2c872000c3c2a37e8944d288d9b3d1dc9a021c54644e77ce2055951ec052180773e3e87e5eaa8986f11e62d91f1bbad3d4d67b129e93863c7552b71c570ac95ceff73fde01178c00d5d7cad62490c55a55da65fe1e45651ab12ffc101b266dc7581b7fa9d9c08c84f9b9f15f6ce7a498ceed5c4fad6483fe59312ebe66cc24aa1c4ef4b7d26ecf86cfed1a2d51c6a8f3ac57955d04117be8668d6a1b7e31fa95722a71a9f301518eb0025d345390d5f514bf9be58443ad0f69d6df6d96cce0b9b1918a468097157220b640e03780e4661b781fde7d3550d9b1f20225b48e58f21c0b1f16cd5f00012dcbc7e18ce84c34782cdab97e63c65f4b11d1b619b027510f6d209e0cd92d765d6a0c9a91bc61bdc90455aea009b0f1004e6338b19920d84721234345b359032a9723e02ec668a6908489e713b98a2d7e48ed9c1819188a9baa0f069e38e00086fa240882a1987e4444ea7381fad57adeb912eb18a0ca051692175848e06fa2d1f4016f955330eb6d12dc749b5f954eaf7b3070879ba1ffc65eae6d94acc7db0152a2da0c7a16e3cac7949f3f81d6fb2b88449bffeb3afaf431c1caae11d7bff6ae018359ee7ab7dc6254656dfa0cb6e1ccbffb2bbb1f09413c7d817c9e847e4a905adc8eb277293683d7d119edb13ccfde21abd202c2d69ca0d7913d4319dde601f03710e3342d1bf0b67fa72d9deda3720872c4d49b0cf3e7c3a912ac92a2ef7297f98179c64c38ef9730b22bdf1ba86aa805324fb9f62b05530451465d1e51ec009b6e6081ad898ada022676c3048371aa9b5687a626540f0ed7da678078c46d4eaea4ba028a23c39cd57c2864b3f3f370c107e5fea6b74b79e047d923d315ad72e4d870c0ce502f5c89c4620b23961086fccbd8a349678fe26a02aad3848b731a0136a456b913dbf65b60b17cdebf65cdb8904b6cf9f6e920e1403434d2ecf29dc8a029c39287e6d54198fe654b2302c4c92adc91799f236c9610b8b5e54f4b7da900e18f356be3fbd755247e26b330295c72097730caf9a94da8821b78f34221d4d5c38ead8ec6946dc8243a51bc2a61cb33d121fbc01ae8c79d7b06c99cb2e12fd0883291e29a1d0e530fe319335679bc319793767dbf43d6d33e71abdabfb75c530032c225610f1de985e3d0b7c6b5a661c88e6dbcb411f0f1b623d1593b51565720f588a0a6d72f988afe12195f5520a5a13edcc539f89ae47de676eb44876ba518015e669e96018c276999d7e91ea83fb3f7cbf075e2fb14160002a2a7a2ebb8ccb31072bdc6595032432cb4ebf4da37c53a64f0f91210394e5b8a8eea56ab4e91b0b466b86d8bc5336efcc27a655106a2685655bc9fa5ca4c29fe6ad031d8a0ecb400554c5f6ecf23938bd7a3fd27b63380d2c20d81cb526bcb64ea7f4999d71fedb16069e44dcdfc236f3708278f4b980a7e4555a7643b03ec7af5c7c5bbc5f817aa015d9bc07f5b340c85e1ba71252e4a58e845a59e26fd5ee3bc5ee244e8823e1393ad70ff1aa34fb69305ca040fa6c5da3837e98ee318dea5680bc7135f6be0f2726bf1b50072cdcb92a1ade236cfbf6f91c06086aa01e8cee49422a731aa091e1200a44688495cb72806cbb9f7077364c282dd70c55db142267b9d6217394c5f6c1ae4a0d3758f36dca7c948731aa7a749778fb303be2a4c90e20195e71846ae244b01afccb1399ebf39cc647bd7b08e2c3f1a60aa8e9fa7c57ebc43758cdbf5394e4dea05ae8d09207e8e6b40eeba340cccc8525e1790a8514d239cd3f1e789dd51624f90f67570233862152a372bdce83ed7e51614ade19401edff08775803d59f5f0006e82b19356a710c96814091ffb1380aa36a463a505f5c63df74cebdbb148ea8caaae56d040be342ab43c0cf61e6197dc938fc617b28504a380e6dbad1ede70c01e6348ad041064d2209756935c856041bcee8e4f5e6e565eb50cbe7140f2f789570b4c04983b20721974fba9913af96ec06baf57149ec4848c9deddf6232879c43c149646226d693889a1b3abea475e8dbefd9b756b12309cceaba64be89387d800ecefebf6c6e302b6484b70b788c39201ac5546287eec756444d98202e9361e9b06a9ce55f58e4bc0f86e6922355369c7831b2cb037bc25873976776892e1e4b101e4a2eb29f6be904bda0d1e284cc4f07651cb16036ee4587e4dc331db9053e7277a6e9f63fa50dd690bdb373ae9d7c77fbdb103e226e7f9929e35967cbe60511e9295d6b842ece42b15b2f6711f40e532849051e07acce9167844e98d6be3d6500106188add6d91a6ba3b99680aa2831e87d7d006700aee0eb1e9c96eafd5d39ec8a38475bb86bc060784e0016ad8efd9664efa69a3fe0f74808da261bc6520bc1800fd6d4bb1b65c291a88b3624652eacddf6a51890057c05d9cca9b08f73b7760efa1421d48dbb7a32974a103d565c379ccaf0813ec8b3ed3b9f8b885a8f7e12791836c9c33aca8fca537a7b2322ef5b53e34fea25ac45c2b5542fff1d00463a96100deae17685df2b694093a61567f43d03d17704a7835e7703949d07380c15a069386e873dc656b40b9f3f79a5b4863cad8d0325e0fc044b0b90951008cadd7428a00d54f1741a2df56954f31816812aae586e91be1c8d1b7ed2ab8a1ad3b0d36dac571215909c2271266286828a11e345210c5ca4db691204df5c526518fda905108ae1e5bf9cb505075816a69258f3f69a791f4b6069c9abb74f11440674ef15dd000ad6cafa393b2b1c78dca6c687f4c62920494d9a805a1f3a13607f59686225ac3c2c5d1b9f860cf2b5c4a11cd09171e81f982b254034556b328a5d10ebd58c98001ed47ab8878f7e83fa13b2073e0a902fd0de9a4d86d1f5cb74adbc6dde698c9bf5f9c0747273888bd2b71fbd69906d9f59690c399d6b8d63861c70ff1273d8acd04fc5898c12a9a836b90904b1c542f8e4c52657f5dbf77c1f083b3f0d1905b0101fcc3d636a31e1fde65ae79d120a47a82cd12d6a20675d556dc834c91b44ee73ea324288af50ef1ec0bb1cec4bbae288c5f976279cda7c44b4e8806108934957c01127c33d687317f887ca7272e8c3aae4ace0c61c0fdf59ba3d881c928a41a24fd6d87e42180bb303ae39127159169cf564a724940cddf7c28b62a77c0a4a48520eeac0603a29cdd18306a0cb9363d0e381f0f2a807533e63fd0ed8a23f58cb07c01f3c0c080fab5af99174637831c42d0053157a42b07d2b5e1c7a636a7669bd8af4f10d082124bdcaefd3812a3b52d1c899b9eeaf7be046dbf43a2e2a5c68f43e701e637e45ada4b18204f3c38d3d6ad5c9da59f952b58355ea51ea3d6c6be11d44eda70be49e133af88694dbf62ca4ea6fd7345394b951fd6a3352cd4add8fdc223d408a47ba037c8a5bb55aac90bf06a58962e85824c2a79e3b35998946710a50e00e26fd701a37cf965b0b01599da800712799ce0580bff23907fc142b82e1fab9e6a0479557bd036b1921ea8187f2ee676eda8feb30717d015e26dec340464852f01b95cc37587c760102b8d354ca274abc08166bfa33e9f522f34ad8cd6c3af2d6e5e51197ad96380ea2cee51c84f2f1de64616e375af899bdbc32550ce31bcda4b8f5eb33afa803efc6d09ae5be5487e98fc95bd016a60f20df86b7278ef0b0ca4016a34ca5e483142adfbc705ea8291c14784658b2e72be12ca626c73707e2288f3c373c64ae18fc4b3d36b3ae80aee7c08aef46ff5b282ee44039abb9c0d0eb8e20136b6516de8a7225295a23d1c6b648f99552123b129603c3fe2cecf683ff8515f54617f3fd54271518e2fe639f72a6eeaf24fbad6477c02d5c4bd92284b4efca387876db8c5e3e1c62953c68a308eb15299ac98e7e58180254598664700f020750004612df15393f933a2534cd08c73937216a4cfffa3bc10188c6ab222c71fcef0ae68dcce1f04f0288c4572e532531e29983cf0c2788ed840b55cef74dd9f52c60090cd33ee28b53f1f0fe4a714638dfa6aa925aa95a3767e5200d8b0145c0a7ff816cf57f25f96721306e42c876edf9d7b3902d50ea95c1c4fb0df99458146e201636fc96d9f065c6722af2d74b1337da89aecb3c3e9aa18510a6a94fcd4e4cb180049751c2c529931176a649f095a66e566683b30d6b784c538b69ef1def1dd1c0e53d190601b2c36bb77f1fd1e5c2001e68655c923068615ad7088f52f9d554e0e0110984e97f8906b14f628407977005ff949bc3252351c2bfa39f5660d81ce44ee2de0f8f229a81198b8860fb44f51c2be7a226ba12df67de94dc55ff5dc5ea23c22e77f38e827347ae083f655d680dbd843ae8d18b9a7f1257b5fd83b790271b0019b8f419ad55fc3e49f2ad8dda1af2ddaffef4eca82fd073bd20452c4bcb44b9de9edecff9a71e530b57b4d3050277d631dd6528ebfc7de48efd428b45a91331300b42e4b760b62b33c87ab76cc9cba368d3b9c90c153624ab26fa658a06cce4429ca9ccfb018d0f124d97c56b01ba21eceda6434d08ccd3abb628b10ae705a559ba5c586f1e231135b5f65e75cc78654f6a59a8eec565368e2c7c9e12c8a1a8dfa696cb101d1fe2a4b0acd9354985f0caa883d19ef1956fe85ab82e665b61f81fa015a98a3c06547333e39324d331e2105847cb44dfe98f9ff8d42ef705e16d8e7",
+  "sign" : "a71ec1c73f54cd67b1d2aa2ad9225686f4307e250b38e16bb8ed5b085379d0db90c9fda716fd3f4801299d7d8db6ae852ecede81d393826205c459eca2d3a7efc6ed3abe42d7c3f5fad248299c43f2ccb6601e1bdcaf2763ef79b04d667df3514fd3af40a62867f7f400f48037fe9459b83c83d26e95a91821097bce970b1b5d6744c7556934f538d4508974cb3303c3400b40217f16cad362151670b7d15dc6a6b16f98f0cbd83bd0ca45f38a05640d89f82d92726544043edddf32d27ffe02dc39927988ec8971d30a005b7c03ae8b38909a5ed5d160229fa9dc0bdeddbd1d28f47daae64e578fcd5be7cee0eb2f648c6a60b8c07c90bec54c801eb08fffefa5266276a5ea0ce2ab9bab0118d257e06f59a7c8769fb9112e4d75150bce0ba819dffafeab745d0e75e3f537834d38a4535a9b9a96078b9cab5f90709aa5dd6a0f905f15912d2e3596f8ab630e5a9c17028e122bed7f43b5b6afc4265ba6e8e7293cc6ebfbb6869197ce769d01095678a0099bbec17741971cb945c62ebbe7384ee6641df437ddfe4bacf74fc6802e0413c00a62585d189dd973ac968d75f4c4b7a32facf0429c1485f3d924a90076064c4c819fd4d1d20d8da47c0e7fbcd9ec1c8c61e7250bb206bb27f2125edc905b7ccb616007d57e5ed1d1729c8eb3700d6128495c2dfc59d855615774aad7273215ed1e252a548b793d60f6cceda787d50e09fb8e2aae6299195ecb3e388a00291cc0458c07bfcb97fde6a2ba4dd03a685d3708a0696667969aa9b00c58b4ecca87d33fa13820f1ac171bee44d5cb9723ae51f6487d2ca25d2c9321eef081f901cadcb3218e99679ccd270d085061db8efb704c05697f7f0da428fe9e6ea22ddd89e64e7d86bcde134507b78af7bfd4e7762124d9b2cbdd2e7283b8f914214df2fc2473500fc8a9cd5df07aa8119d0747f7962e8dbe148729552b7f2094ac9812008dad0679d45cac31fa5ddde35ed63d3f1b159930f20e32180e342d457b39d7a21089ffeec68421526d652037ce0c98336526fb47d11c847434e43aa527555add002eec1844e55a3e0cddcafe1d6a37414010bdd4d2ba621d966ede3d52331868a7905ddc74521a77021c11f9e92260deb0010dc5f27e24e35ccb06e6c6126b99983a22d84b612ad51836008ad8c5bda0a956bd6678781b2bec92571ae9fdeebc2a000f22d5104306d113f0584c43b37b0686cf1447bc13e1b7d259795754292769d6249ab4009ee6e1e68997d9ebc0fa9fb3a5b381118549d226d74afa0898198680015466ee18042d3701e33a410aa70166b13ed0fce8d4bd2403b5165bd163bac96987fd11969cb472a48df0264d18d0b9e45f3fc72c573667ebdcc7e530a39db21a5963b6679bacaf74c073ff1cb215726e85129cf489361c981e17e326687af0c30170a226eaac02cb6b3a9989673078b0f2fc03f552cd820ff3fa6d3facdf36575c35d4c1833a7b826edf89f281371dc6a4d456938964a5f13932e551b8ea7262fc00cc8fc43e5ad03d9b8833bc1946750dfbb1cd6ccb1b0a023939b5007e07c371b8058d94bfd7065fd94e151ab276c8834530238203c2521c935b955f0d06eb013f0d206dcb03a52612600cc2362531c3655e0da7beaa99668a69ba4e0757ae5ed200dae342fffba7b99c330e7907ec0d569657fc5de45858d97e3e81fa3958e2f14813f37e7ffd1f9e1b2567b0aa616490a51270de8fda7b1f6155af6e8897c893b500a7aa279d338df1c17e3c33e3bbd9edea1412a2dab7434b4f5e087bbddb91835d316a42557e243b3be9cf6fe4eb6551ea4adad255a131183e0b0e84cacaf1a2c3333dff25f509cf1ceee886a04924fb9e4066df408377b8263da3000f86f6672d01a878a3ac24d18e4bba5af10b4246a121a9b7aa0a473b1af362f7e3280b1eb74d486cb7c80bfe3ef49f184a6d78e7d01df9718e0e76621f84f455e18c1782960900509c2adb6560cf6bf487f4f73195103a611853983f98fe93dc158c7564101c2bcaa38fbbc1a1467c02c4b14fa27bee4d1001c8f91b9c5a888cfc19c85c44af61ba241cfc621e9acb0ddfbb074bb05b14d77b20c355c85437fe44abe72c8a266100bad7a56191ed097be7a0d7fdf897db7a31d06cf86f1ea6b5c52f46d2336fb4f84fe0ffddaa9fc6dd90220cf7bf13146676a5885bdf3da2a21faf672d03d794680074e516a2188d7191076689dd3d1a6292d4ca77b9eae27508594311863fe028de3e1aa5ec89b6ae65b4118b396915eedb0cac4bae0b1c00d8a9616b55dca9fcee0a1b9871307d2c5c7eb494ebc700a8034b356d7cd11f5df8a3e9d0f64062357e01f9c99564a1e099e6609ee00159f5793254acc904ee1f4096fed60af419811fb586c7d9ef461fc1d2ec54f3d261c43e04cb0903fe912d7c7a3b5e3be09e5260cc00af655cf19074a8889099976ae713c670a46d725c503ac8b855f8003390d04b82ca20de49f5332278ba4297044540f9684fe13d74fc720e809d80162b93a5b1d67940d1ec46789d077922f7cfd4d07a12e023440028a3bc4187ea8d44cfc02edf01b068a16a6ebb40dac323c88fe69b3e06809bfa6447d6cc5822eb5300b1a58635db3caf068adf76e3b77b3407a7be9a1e7ddbd16cd464ecee4422d9ccad282479017891af7d71801e1c448ef0d6cd2fa97cb0a7e05175b5b68ad55c27c3868cb94f854a44e396848fe96202f9e62e0910a80d270560266edf6970c7ddb23e03c02b5eda280b9844d77108112d4453b8c703cbbcbb520e6663d10c64881660ef5c5500eae9f30116e13048daf1ea6acf7de6aba68efe19325be794766a6aa896a06be696abf64cc2511690e19c86cfa75e5e98554aacdf4045e78351fbf71c92d5963100787624f10ce082bc0427c3ae45354235b4d607d5a9edc09217d37634e38d4b249c368e5f693378b3cce02f53f340a810d916ac9320d2f6184ea915f86a4d642a149d4fbc880aebc3f16a57652e19e29bee4eea32a26874f96237e4d5d5e5bd780049549f68f2324243db5a76fa8db5656f542f977d7c384f48961a8be85841927efd031be6a838b27b54493889314d43bb51dd3ac0bcdb254da07a7878d73204cc0030e6a1aba917a85ee2abd24d61318fa7e64fc93f4081d5f6955c45d0826fe06807629c140388c5dd707eb3900431adbe31f133b52a06d7fe4cf0c19d645bc96dda8029b8aef909126a327bb497672cef47083e96f4d973c6943c7c989a777f8e00aeb6ea4600a97fa2d72fba6774ac1d5ce76c372a95f445bcf61683f9da12dfd43fddc17ccdabb4f521ab2e6dd84369d8b2a86afa5d44de69e0712edfb926883e0179617147709c4317cd0f84049ebded082191fee5b71d32ada589bbe52b86c5cba75adfa02484e94f57691cff62fc6ddc717aa93fca2d90cdf5328e24b37dfa2991c64dc464fbc77983acd131a6b243289be177c1febbf7acda02d2612e06feb80140dfda454773011119373a675e8effd73897ed92731dc26796851e70b8160d7bb6aa99c87a38a58f26420402b160a74853b47007958b4936b757c321c16df91901975c973b5ef28ac60de81e096eb92bda3a57053f91a9e37a315a9c2f4dbebcebbc88cceb2a2febcd2181e5b7c15362b29ce8e98f7b93fd6a7e5962a432450acedf0f115b3e14a97e4391a1bfe098c18135732a745f432e641e8220c1146eb65a006b56fcb85b149e2845a562118e7526eccfffdc96cda9a33643c314bd24c1fd9b98671eb2eee425a168e4f8761d4b79d8c53bedf8328853674766766576269c0d019823377979c8fce2f93216d1f0ef92c271bd0745a38c5f82c948548f903fe96b9b2ad74441dab410e4c3370d9a631667603ea1a0bc357c8d545fa6036b3fe4fa7773fb350d6a322f1e44cee043a3559ffd1e1c1a082f7bdc564a2d7bc0d926a700bb2cd5f91450d56fa6c1fcacc720865839c3c3b8b1f760cc0b8fd3a9e89bca26a16ff2760c6457877b78835b58ed66709810cb50888fa8593ddcd9d1798ed060003f354ca503a54f7cacd26050437a5ab109e0c57d5d4e9db111b282d8ded79a54f92476f0423da21d877b796c854c6de5bb742240cbaa9ad62a0fea3bdf23e3c23a092ad31efa73937399608f22badbf03412bc75a054826c7c50df6529bc481300bf215b705290f5f91e3f7ef8dca2551d521e8d1452fbfa63c856cc03510715b7465891e675660909d197abd3bd5813d314edc4f4d0a0b5b443b9db37ce30d613015a2068dbec68594cedc6d93019cc570a661c7d7d7b1f15fb8f0ae068d509056332b3340e76e3d6af620e566d6a5fec15f46014a620200cba35afadcfde0190c04ab8ecff38e4bb6a622353ff3a0f9c951b35ea012e40e8e4a14cc9f88afefe14000027cdc941d22a1f2444c2e2dddac951158d04cc37ad7fce7fd75a66477177847c9c7317422bb8df08996706cc934bd2da4958910ecb9c5c8d078b7d61759d9201db7a12c88fdbdea893eea02d83f40d7f6e7560058cb2ce798e9679347841868dbd52a1a74d450504fbdb75ce48009e24fa56b9df7ab2bf5c4662771419d6d6dba61ca79eb61e9c9b5c366daa1851b47f0a0e11696af72228f2a086b292ad427901aeb75a0c79cbb914671a1f094411e32aa3b9fe88f983902151996a94342f664825d8cd6edf460b6e43c743b51aabedb1e88a9059914e97f88327c8c3f460c71001879beaaa47281e10c1f6b8ded409431df55c8e89716907a6fe73bcedfe955eea9038d98035d1cdab3e00ed448c3b658e6b4abb65eaca49b67f720de7921ddd5655d2da9655e5de6a8eb374ec6b9902b9307a89441e3f773d2a9bc4e94aedda4700f5765d595c7d6fffd7ccf46e301af2ef0032a79b4392de2787af9b491585478a2a0f5385ad232225ed529d0bef9e751897d29023d4c9441e9d9bf2d9fc36489d01d919ee51f9184c89d29bdae0ae060d4095a57315074757687c20041f23e186836b7ca3c86dc2b3d88a358728b96e808d05776d92df305c8d769be3a20e46c8b8b0008aa1644e86942d6308624b8337208ec471f37099b450db73da6ec81c67d200ec4a7f725705248ef0b244b683c202b84658a5d040f4c3da426a138cc4bd26dd4a6963fa3ed86ade5ee55de021490ce1fd68cc1ec56e06e0e2d3b62b67f47fa5008ff9e8acf75a63c589914db82ae5fe7a33f996d21785457644710472f9b1da7f0ec91be91cdb1a155f41bf5c749d112e1033311a9674bfd1f35a7cc94a81197471551c0c62b7f25ac625cd8c8f796de844337bed3cb6473b77126a98d09a515e0184ea55b2055a82ef7f4839e644a04369dc8dda06cdf3862857b72328c17493eeff13c961ae10e62f617b3ea6dd3b363170244cada20168e296fbf248c54185ef01dbf503cc0a75249881fc7f96d4ae833d925a786465f55be6e9b5cab6bc06fab8f62343f78583710cb9122f7439a7552bce920b4d70514cc11b6e6cdc865194374825762ae512c47f9d2a3695ec536c214999353ad81a688d78ecd98fb1f7a51801c603f83d92e77a2f5295e0c6e57b85def9167ce2333ecdaf7d9c25a87615dabdb2934c3373c278a576000f068fe71f82f87c670b149f79cc6caa96831cf1388500b6a900b806af4242e8c82ce440cd93bdc2d1eac0c7d8e6bf9dd18a80e56de9c9bf58b682dcf83324fd1fa7669f86eb9233f66ee7a939849432bc9cd5469b06de6279b9cabafff904b36bd7d16f73ac4cf0a38bf71e879211ca104f90674986e500cc9cf4a1b25a35f0584911fd8ee22671d0a3a561f0c45bb0fdfeab99e48f9c0ff639552ab8586c6703ad5df7f660432569025039687124f8b66397e90697b7f001e69b46d37076592a549f141dcc4e18fda4cf318d8e8e96203dda06507918b9b6ceebcbebd03f745b675fef97065dc58c013abf4b6b29e5abe0bb02daf5e95826516010c2f50b169bea5b479a4e4234dc79dfa5571656a0a5438925d069ff2e2b01098df195c730d43b73e1b6c87f9ff05471cc9156144a86c4be0be1756fde833c61dee8c8bb061dcc319c2d36d7341030ffce7d18de1987fd36e5db012162091c0072d69e90b6f1ad0036fa73e4cfdba1539c8d4de530642b2747859a621cdc14d5d799fb3b0fa8bc3507581eb610a4c0ae1afeabccfebfcc71defe49f2cf329665e5a3f4b23f205a8b4f988f73fd58472b1fe2ce135e87f4391c0769daaefc5e07006e4869a59ad3a9a60a6eec02b1c3525e00f425df8ecfddc337b882055361f7ffbe6fc044379c26a502202f1a5d10b3d351cb4d1ecd101d2b8e0ae1c4ce80d67700d199b4d82b42696543f64d678c4031c42d5528c5008e8e8c6a1857ce7a21d5ea5c7bf83cf9ef0d7db8e5365103f49ec3f55a2fe976fc5a3442faf1e2214a8d4a4a358e1bfd0c18f6a4b95b6c7a5ec337572147913b63806e017d68e9ecf12d04015b057190bce074bc35dbc3d251dd37baf074edf7721ac4761ad1df45ff2ca8c3ca2b608b97121ac9abe48306f56b33a2e27fbd7c67ae5f46be4aeb84e9aea0db0073e7579db20f112bbd788e5ab74e2ded6dca548822e95d4001e2fde3e6c99c6e8149ea5bb8c0e778d998177a7175167fea9221a4c11b39bae55298ca3ad5e9dee8233d7a25c9257adb2bb8b0f58f9b4b41c7a48fca1c977391e6cefcc25e2db40112d7ade24c48101c0ed817010f456217125152b39ab1c9119a11884bc02801ab386832fe9ee88809b81fe94aeca0dc3ab82d64257627a1e451ddf4a304034bfd01b3885f4a2d20ffa09fbff169159b947ece5c894108b24e424b0b33051bc23ceb2625f0091024701dae0e87b58287a64c412fb71415c78c35cf2739b67758e301a4fb1de7f7c5bdaee39290fd67d5be33a1175c973c66ce0ce8dc4fd66bb9100e01d4fca8644bdb9c9cac7fad9a21a4cd034b6ac43bfc7abc4cae619ab19034cf677c0857e04e805cb6d7a0bd3bf418b3d554ee4ec09bbb45bc2b6830cd6501d561001b772909fc87b98e37ccbc682cc52c4e5852bd7aa2a0ed1261eb4ddad9ef895a8920ea4841304e817a10160a273e0ca21fd3018f6bd0c56702aafdb6e25a8d6862223b15ef263b509b6e8ccceb859cb5dc55887e83e9c1a7822f11bd356ccf7c0070a0eccef9a883fd02661fcdde94b5dc843e3b125c47009ac2848ff3f74674201ea171c55060299b3abf08abbb4e23f529305e9c6e9dc713c1775058bfe7d55001581e4245ca5071aabc57f8bd8779269790e399c0b22097a6408051cdff0edab310fe8e5461b4e960e9b89bc52b64da0412265eb04bff57c99113dea6e5fa437b84c75dbca47722b6e25099586351c890c8269f0272fc8e1ea7ed06d2fee4586a002660728d1bfd62b44b2833e00a862163a502f00a9d936f93f699f87809a5b9f5a54cbb1a749900cd49198d57cea6069b387fc0c62f98dfc2ddd216e0d3828bcc00dfd3e62ba48dae0916114dfc6e5dccab90b58855f8aa9c1e58ebfa21ec0f6df96184799f6b0ddec5d5869341d3d998d48afb493050dda68e75a35ccdb12c1f303b74923f0c71574bda1e041a2fd85ab0c23490d366e1f2818128b2a32179300701441c5ad8fa1ac44d516f302f40ae17235c7dc86063ff21cc5952136a1801e217ca29d3fd374395bddb39d751b30fdafb185add019f3fef870ad02c4037519c3900044698a93a959be215e63b0b9c1f2ac7d933c36bb1176a4ac0a7aca3f6f300d9caae946deba5fc0315bc5e1e51010049c257f0b02cd049d39946f83fa4916cbb12bf1e8f6da9d27c5a88198d5448607c97cde5e68f4f01c6e95ecb1e1ea9184200eb165655a49d7375b3d0a8adeb3ffc51c771910fc3a9bd8aad7a2ed1e3959a6355de032c668b5acae655735a5206927fefb895894cb9655902a6de9e1519d79c00e87cb2773ca91c0c5715c3c02a23684fd2e9120f836476ef31bfab5adb8b76948080e50e2e7300910358f86cbf12359a35843ab0340ed8d914865918d9c43f9dc99bb1f4db5562747c092fcdb09c3b501f8abb314f309e5dd599cd2f6c8bd2770101d04f340c8ad524da8b40ee4beb70563f5098359727fd088e47a561bf909c8b0a6b0c0b138f4e30322223c4c3495c04a91ed59fb21f6d164f5b2d6c0482b76901a735769b341e272aa69eb9e300aadfe874530fbf3b4a3086f83e69a161bf8e3552b5a789506fb3291f1bff4df782f934a864a25f0655096be7952443956eaba7758bf03b280fd33fea4db0503724da22dfec665cce06bd65c9d1f10c43a25c2b00c5dadd09f6929b9d44dbae5618df411c3c41de95b56b82aa6370d17c43bd6c0464aa7560aa5d0f6d33e4a3bf00d5a825826d96d97fe2bdde65462ba5ed14139201c3089cf5610f9ba306fc839cbd62cf1841c6f54e30c3891da4a47c0eea0f5f938139be8fd70741b71aa3144193c4b69fbcee7d16b18d29eaf1611de6c98ca3d354ccfa26cbf69b0af74fced932c155d382d2c395d15660b30312272e35edc89301894cff42d36dcf01a85a55a8e5450f9b2c02a3f8b1a419faff78258f550daf9fce32f7d0ae4a4941f1a1882efb764469fd8141463ca7d40841d4a4ea3b513e4c01ddd7c27b23b2cb8e31c55de2e29c395dd3e7bea1867933bf0a449d6b29789d3fd46bae01a1555a5efcd5492b98fe677d69439baaee388aa1a7b4096e24c380bc48d3055a063fc93191d9cc13836f5e959b547b4f264a633079a7ba179baeb31d00dbc58126585b22272fc4d41f5127393b97acd4ac81a47669feba1ca7c7f24e23982c63b8d7748f86fe918fbf631c134d230e1ac92e2026e594e6b73f1569f86600ef2503ee304313a65a15c9fc0a80c84101644b43afe92841e90bcd3dd35590b8ea70345a8b02688fcb67d28211e4b1b7ba35d61feb011e2ca69df07cc819216cdb615141a46f483dd2adfe17212b492915dddca90c7e59547d948c03d151a1fd01bba4f9cd725b70d2d2c32682d8b971533b2852e7d049822c2d2a29a9ad9d30686311221f3850899e99032bfa27d3a47fbf7d03871fe2c78956e6ee94e3a9e6be0143b71d8b72413ab1c84630c3a5bb367e47ce49dc4ac783292afcff04473083b17b4fc8fa47c8954a88f880131ef9c77836cff12988b668fe4a5adb0bb9218f1939a80a11440c4ac87e9a0cd653e7ae3a88192d61648e423fed463dabde21349300bbdf5c891bcc2a64eb0c2e7340f11232340eb1fef0ef004dc09156d1ba5416d3febe691175c61f183da8f228db550abd8d747d491a8f62f745e43893bafdcb7000cc8c53fdc682825fbe4e2e26df92d379aa39c5691045a8ab27f40171610a0b987e51fb19282702c608c66bb96bbf556ec517bf61267c8a1e05197508806a2e3158a85110465dd7a95d143e85babab609cf52f92b6f32f47c0e8aef01ba35228900c45417d60c12ceebe72e69f0738f78a42d5c2259d902a5d0e71c214ba590427dbaca7adfdbb13db043f4115a21a47a70b3c3e8f5092ae7866fb08c861f55dd020121343b380525c0eb882eda639343871759be23a265fe2f0661a127463450fc9e9426f331225ec3ce699640bd6d16b9326d704f6a0e724546d3cb6f4f3b7965178faba73bfb26b0b06f218e11763185640d8f0a3ac7945b9c30902747c97927c100ec9cb5c90afae72a2aaf120b86894262f231ba94fca0875d09d4eeb103f79e887c93c0d2f7433cc509b1f32cf11dcd479438dce537e4315a354ee2bb719447da00859b395f32bcc05a78c11452ecaa07ae346d6a0b0a349c309191e7c6a1d9c9512b6a8c843fdf1fefadff5c262cb4252178fdd4b3cdce5ba691f4a826de8d4a88dc3471aad0d5b0188a4f065c32e75d24cf10c57d8ff98c3cc5aaa5958020b1200064cf62d9e7ddced8be44f6854403c5d5e9e1b21a28fb7930d88ac6841d2d093dcbd46d7d6a879b8ee561b1507e646c85d4bedff3999db7ac684a98617160c101001f28401ba1a1f7035562f32d9e002ea5418b10e94a983d6b3584e9c44ca1ecb6d5e598b37d6c500a2e891ee919d2ecfe88f5014d3fa954124665fd3245d094510f8e0df436605b0dff0409463aab6f7e69c5d55b230f1c07e9736fabc8ecd7bb006de128695ae2c3ba464e800e93819dd57079f1e1cd9d482629fe6d0bd327ff5783dc7c02bf13d2ea23766fa213540af55e61169d93b4738834b2bb6ba7557c1a0103a6fe1b9d72bab291c5f15abd0d9f053fd01a05cfd95698910644c63d98fe74736155586f1709fbde5aa5746c7e38120a07ea2c733875c09a681cbf727c37eb1dd48510f8e136e5ca451f8b30b09818e69395679ba050d1123708732972173c017db7a0f5c0059fcb23550d162a7f1eee1e0f238fba24baba5076f137b123c787f64dbbdd60d2c0b89e95545fa4babdc47aa90f28d340dd23c10b3b9054557a6f01d67c8d3ace304fe25dbdd1f9d0128fb4f58f0413fb3a7599e42f3f0a88f71be63e84f288186f82b17675d693ac3ed1ad61e0e8f0f303f1ff9ecc1b84fc72807c0934e449bbedb391fba97457f7eca7885edff75158b9ccf5a9678fe0864b5f220106d4975e5605570acd54ef9a13f5de5348c004382e312971f73b05152120c82fa285abf38f19adee8c157b87fe0339f3f92fd9c385dff4fefda43b38912f60e700a84cdafea3e5e877f58d55460436b38b13440dc92f592d83aabd690fe1d9f7bc25f3512ab91ff5076307f5d3a10a2e081193fbae56af5451f0430807c2c13e84ee9e6d86c6ae1543dd2ed167b325a4fa552081ee972b605e97502c3ebc736532001f36b8519951e84e0f13039072ad9ba524fe700e74b68bb28a822405750d62a0bb1a56253b0f42983d3197e9396dd7da510b8b33d77260cdc1e2ecd20ec0df5a00f753d0b10640ec5214e44d51811a3974f69693de0594197dca31d83a160a6454ef060b0ce21344b4e92b45799dec1c889be6beb5c3f522f11aec351a251a1d40343fb72359cb4201141b0f1be2832dee9919140f572e6a37deaebe8cab503c1800099f2d7b8259d6c38eac8c10361b9213ffe2da77d1044f5b6c5437847cb575c1cbc09bb98fa0b9dd9c2afb6cdd1e4dced98f018f50057c5b8d301c41187f18c700633529b50813d2555b872100fa1afd7abec562d8474356c2fd0ada6a2b68d8dcc6ee8b51dca76a1c92539f1d165c0d571bda4ca0ad4d31fed6c9325854c6ad10d1a19f5cba2cf4c06dd1fe26c15218a0357474cf45563420ae7c7511bd8446b400cf3a1628e07f7f3eb7bbaa8d77670d3dbbec26a0e13c468f6a1142a7a7a064d314d1b68e66b0a8ae379eb1531e41b7f31c21acc28670ebc482c1e3f62755db0000adc3f2e7750809fdafda2a04649d61eca9446bfc8c7aa57c857a6f98fdd9e2372c7136ce20d646a4836268336e4abf1bdf8a508d95524dac155bc32b35523e5f342049cd59be33dd364287d296fa9fee0ff5e1e92a1ed8b061a1f74ed7936a9b01394f36156e65a9040357616385bf65dc7a181c9b454f204324ca9a7f582d6fc83e7224e7da21f50fea00e40aa26a816c195e705bd15dbbf508d7535762701b6f01795ef503c524de260ff464f012c6860466995526be7bf35e68bb37756f1f859b910450737483cd94e1211df66af639a81005c6458c6dde84931b38776b6d3cd346462b75ac6fe66a1a039c9db066812b53b960ee41ed360bf61ea35b024d0b8e00f27dd35185fa02dafdf91aea5210bc1c1d9a35044dfd21a676a684468f972f731a3b45a6104f507b101284a72551435bd33abc474f0c6c8df9c3c1d276d0dc5200c8883481463c10a0b8e765b78f089d83ef608e7faee34b62f9a3a9f1f045a356761ae7c2832de772cbfaf0f738671a5559f7b0d923250647d69d21e54c913ca334800b8df908710948f58b305e067b62b6672017f7cc1f3354de45d08eff125e00535c8dcc88a1ef7883549c3ac85be130b869dd25088325419b49767aaf2851cefd47a48d1563a4ef66526a84f1fd8fcc3fddee0c7bea695c37d1bd9357b88875001dedf40a8d440f500c04c6211aa1b2db768f33f0efeabe5f3f755d7129d44979688efa53b6d8ec3dace15d73d06d34de82ea4d8144205b0d1596c2b3e3bdd87852a3d40ddd72ad4d2323bd936748424b9e9346fc5b3b1f05e2b06bd0f1a8e9c3008f1808aff72fc3fd422e6392494bef91ae3cfd1a4c034ce408612b6ec5c9e68074a07d87a798ab0c2cf460442830221c56b8d24e32f30f6dd80c0e32855226d70124aee9e0c87234bfad56c8fd72af5503b82dc92ee1aed75e721ed976d31d5f86f2e21d29ede326d264c2e97bc071ea216ad8aecc61980511ddcfa01510ce4859e3c3d5d482e0b78f3b69a97c967354d9ff80dfed5303295733fcd16d40bd5a56012558e1323fdb5c98a7ead8e15d7864743476cacc8a247b836be61f72af36d3709049362b3f8e6747142417c6f076ba2b6db8c0c57f8dde36de66a3834e9113c100fd8cc111b73bdb26f837edd382a138cd1acd2f130b9ad89690df05df141d7e76664c107eb7122de443146a0c06f70bd4d98126651153eb3aafa12411db4cdc64c69ed6dbb164b8a043f811c6d786dddfc25381a6b4fb045c699336d18eb682d900a03f21e1315cf079dd7c97d6efc09d3d29e13e1b9603d079a990d884f4051a988be902bb8f38ddc4727f3c4fe3550caaa38a5c27763c863abb1c9f05e9a9cf070071d1e2dd9041ecfff11a401f5f780539357c2fd38c5e295ce00442fbb4067601a65709c8bed015481546892908f13b0d49f7c913d92eeff829565e7a4de28913f591ac8908108989062c1370cbdcb615146310d6abc76ecab74e497697a72920015c78079c02c31f13b59f520b775d3ab317eef3a5dab5ee00773ab0f6565cc3daa89a73f6509ce1484736ea2a5a0b91c12c922757a25f74d1b0df4c29182817ee011bbab7d927f18f09e2ae2df12ffadb35faae326b86ae012a67a467417b23983b67deb035cd2c725ad7fa0c1a2ce39a1195a5c6ced301b2ac3e6ab0988a02bb9f968ed8e4360668ab2bef8e15253b44fe6ae85dc8d74e0da322dc8a073c53a30200445908ee16e53b7f2ffc4eae912dda5affc4a686132be09fa827d4aef7a809a5a6b20703ca035537377801b44c519bd9fb10660a34f55c01e0959da3a0484ce201288171e315bc1c3e034e3d113d5623cad3d73b909cea218e9f7af47788896d8f29a613ac35aac26c7e7f0478dfc73821b308b8353307de00576d8189872211c5cc6fea1edfe8322abf42cebefe5a614ad4dbe9c5095e53c5cf9527265f5c9d730008e5a416bf397f9b943fc8752dcbec773dc39136d20353c3fd88e40220696bb7ad5fef8ae9acdaea5a1b0ff14bafb1c9fc03a4f002f90e2603be0c7fb68df32d00002c1af32a3460d5d933dedd1b57e158c52e25099185ad43d6c4d4684a26827ed046e74e9aa18a5c99356267a4ae548d9d739e964e42591aa5c9d4c4736655dbdc6f5f119fefb50717f1223dd64d41c8116f815ebb5d24bc43b0a2f6c0bd6bfa01bed2e9f70d0bb3a3a2a7a4a6ab10bb52b37b3a2e12c0b56d00849d449251c83a79286bf324659ad2ddbdae025a81df049d92d8183ddcf244952ddb3b991e4ed0010a04645cac2e0d82dfa1cca6932023113081f3e3f0124592d2821aba602e624e543b00828b47cd2ff3ee01be461736d2ed2ce1c8332d6a879ae22fbd3b90b70faaaee7cab3b9178687ac4e8cd9e34bc9eb250e1390398bad7ca72e401453516e01060d7ecdf7a3a45cc4b7e9f66f437af3ff90a21eca36103840101bae786a72644dc77043691c6c1d2d373601f74dfbc139a7bdee669b4056bff143802d7edeff00ec149bcd959066ef4207b08e513a253c908061e76b875215b5c5da0b3e48eac3d8d97c597b12205218e403a64264462d4e17ece51d0e79974ebced5e723d3103cf26f9ad7e30148b0822acd485dfeccfcd1de09bcdbb763c7a8e856dc5a97cfa00fa6842de433eee62722e54500b82ff2bda0345c9244588c4e4e70180cd038d4591aa93a542927df849b44d17e5e389907f0d331de78928a9633a576e4a184100004503c9afafd272f8d4f90cb114f8fbf11dfd5a300f50c42db13734a6e7aabf8144f0df8e904e5e5c3c4dcf8106b9f8c5a84486115a477c6ea5a7fa80657a2809ea12a52726bb83ce1b18783602398db929c74d5e1f509a087defe66f89b9781800d63381bbe6cbea3bd73095d0cf31fb5fa048c320ad7916a0fe34b3848bdaea3a1cf70166eeb82d8685ace598cfacdd418afe819ec063cf881c4f2da40f7ad417002821a9fae414351b8bc2be911a4048370b785d10e222aec07098d7103b42fcf4a5270012f33dbf91f4d3c0c12b4b153b29d718dd3225fb8876ef39ed8831781b4fc20c0862f00b5d2059e98a986835fe1deca4be1cd9eda3c0c5881be2dc85ad01fc46c013f02e28d1336eac16a16510d3e8f41b11936a7d9995da3c822473068d118bbf528143113f08151deb57634c5cf15e637b2114c49a0310fe33dd3dac4b0087800b41c88b6428d3fa4a5b6a9cf96facc6f3590b9e1ac5a8796feb2c7e25c9ca6190bc99c9ea2b1df3bfe1f352aa1908079feb5d8931e7001f789ca6d3b45e3102594985b845b5ceb8e4fbf0b23b05e66d91d225d74a47799ac9d9686ec60b0142b4cc1d455eba619abe4459ea3041bba071e1eec2f882aeb15075806cc94ff47594420c9b56feb6cae906d0773b75982076e83c2d7c1b45499345e07a3e197a00d2460dda84c614f75c508eb5c74893b3eec584e5d7ad66ec98a1f71736d45a62132be48005f58da59f4046efb9ede3a084b124107a46183f66391d8f53b130d88e1a1362cf26dbaba72357db278626e749a3dcf9cc26598d18ea9e5a8d07782100d11c0e2991a04ee7b3b910242755f094ddda8d7915bce316402d1ab6fddc9179f54bfbe8b16a24b8ef3815b033c1e57bdafdce8166c5fbba555d756efbc6511401d62ec0e02acc9d1235949c75729006a9ae08da571c5a87aec942db090f7a3907421631d6804673a34958757283324c8d71288c70f84ab204514e47d9575eff5fc66930b12d35cd10ef56efd1d0ef7562e51971f0e1963c0141746134afccad0601fc959836b2b8b1d698869fd4e7c0886c87fcad15460e0ca3cf45ce42792b86a9d484982bfedbb18441c5716bf79d5334e95aeb74f90be8dc99b3b46a314186ef01c93199dc86ff39753f28d1f7faf58f0362ded29e7c6b99da34f9ae93e13e7bca41cf722cb01b083d5d0b4d775fc24566fa0f127967da92bb942ce3ca5ff8cc013fb28cae476a1903986e1a22356b7c99de1773d4c500f31550f94186061e2695012a177bce45f4f64f134fbf9b8d062548ee4af096e2f43a28988b716c0be44555829ff2452b403bdecdf26cb0ef3035f657a8a95677a76ea75e22f77128371469017c80c676c64b6ed0dd3c9ea7e4697556aa88623592d5388d9551b3f779442ec89fa6a04e8649324805cdd9314b10692731f13dd0440f620f898d95bae0e391e64b5d511a6df5d3e78734b9792e219caee14ab85ffb5d9cd2d7b379c0b4a3e72601de82803f1b219a506666b337ddc1deab3c924be7809989334247fdccb37ebd6411185ce4ffbd914621eea684dc4bd6f357cd075ec24d20059eb7c50264f6351c010f35018d2e1885a36d80c3cfd2310b796d75ce47aa54e7eb125cedd862d5c1c361b7265ded5f33340c0b0d3acea491d54964926a6371007f2c87ad68b3f03ac3bfe2e425bf97611589b106cf845aceb9f6c07f7f3a5f2513422c78da8d158afe00875aa9f58680a84d17255017e7aaf8cc3a15beb8c68a8826059ece7ab53f7ad5745732a84382eee997be05f673ae671376bdc66b4eb8cd1988cda39fce3b63d70099579fc78ba8d9afabe1e6037993bd1f0dcde78ce44171346a790a18c4681cf5d96e983dcfc6d69316331d32ef3752b0b4e9932a3f0115cebf54ed26269599bb73b480933222127cf7f26732b955494d4dccbd843f3524821f28ef415dccc4af001f1c4d66f96764e3c0319c632692cc8ea4e620097bdbf13493368651da630f08708c695107d3c4cfc71bbca3e929c102143ec05692fb86b8526bfee52c1908d00136b1692e228531f81d265fb1681ee7b595597bebbb00bd255f00e8107b66c13977bd207da1517b9b695376812cba2f291820c77de957a3cfcec0ac23ce574004e26c6cb91daed0b4b208048cabfd4c9f2bd389e6761a5b5fcfe18c6492caae6601560e123da21412a8c623e3faafbfed5dc4d86ad20ee4a15e8d1be42e148e8d7a010468526c58ea9587073c6f3c643dedb1d91e70715b68a96e68ec0c0898c49c01122a83a25ed448b047581209c96307c9e02e657384809a03c089a24701c7750d125a8b2694eba6e73eb377af362809c0f8e80da8de37173f662c75c8ad461f4f7e32d69aceeead0dde3b0bc7ba15a263dec302a178c7d1b1fb42aeffcbc878eb00a8630aea1432a7c3eb578e945a9dc2353150d92f62647668dd1c3ec807ae34880b7420c8e5efa6f9b2fbb77c8e3b558422c82871ac86c8c5ec06355ad9a1b1080030d1f1245a44c2dc84d5c57537735919399df73909b69c2086d7c5ade5b3c393ca8a57372db2796522e7211fc12d0303fa28be72a3b61bc39d1b4a61295b5a7320c91056139075fd4e53690a2c125cd83f2db026b71854cdf7e9a114ab5acd23009b476794c8f5c0826b8041c6ba28f5479dee5299660d44eca85c649bf09f58df92a46c45af166082665454a6e3213ffdd704e1a99de2248fcc6e97796441f33801b24fcdebc0fb9357af7ead25114f96b776f1e65d3b21907aca127a874517f8f66f187ec9d89e9871170ac745966a9c156403b589510148b062a53e908a61060ce549e4d9bf7a071093eb89ad449d8e107a17d2bfd0abb97f6e16432142b42be200b369609a5fafff29f09254718f09b1443b11a6020fef016011a1ad2e308325f6b2a50a3358123aeeb46cb3d2939c3bf2275672fdd926eab83df326c8eeb5be5901fd09d9db475d573a121cfec3571b62a9c939969615b25ae871a3d74573e2a6016adb5758b89ac0b617c0f591447fcc82b5394f6a94ac5bc2f40880a9f2066387433f09372930b53c1a6a4115520b7bec556a4ec5b824d01ab9a96f86f828b05c007034f2d52d34145460dd05549b9a2a9cb73530427284e82fbaab3b22e4080357c32a064fd97cdd8ce04d47d0690dbcf606ad4e2b039b885e366748288909a6e300874924dad013506515eaaba3400e0dd1ca57f7722007c41643a96fe1c92848363745880563f31565d7c59027fc5fd7c3200b0637a7550e05e24df09f0d698ca637aada867c7290915dcfb1ab8147e876c64a52068236f178833b7041b291cc9e000e3eb7d945087a37246d2f47dd70628ea73a7d445a56b703e0f07905baebb782b1d21a0bc2c63fa86911c15d5912a31c6355a4586c018219ea5287b55676f00701a3b20c97d19dff7f65433d6ddfb1676bbdaabf742e48665ef60eee2b1c75e7e25f367cb4aea85abdce0dec328bd9f6c321a084809c577036bb012fc36738cb619b326ec8a9b2add8a78edf57d077491b63c32178401c5f4b6f49ca6c6491033f01b87167a074d6927d04043450172a171becc0a070ffaf49c606ee8bc3fe19fb3755f3dca91f69c2591cde85185867f73bafaf83ed36044fb9e41891eace6df875010fe0ebe58e7fa32743bccdb3ad0ea1c2ac5a9dcc8e2a575458472816213be1a5dae1cdf746f8cd3d528d3d4be8f96308f5a26dd6e6e2547cba215f112869bad4178d4f210aa2a9d23aa2b20ebd591b394b8e86648e9d772afcb1917807933c1c01ef6448a9e873ea75fdc4534563799214d361720d048bb7807b689d721f04e1dcda2eb0c48c0b303cbc5a1f3cd7e9c1bfd7411021fd4c6790051fa820407fbefa017ce7d2a4a703cd1bfdfe403180524e73216946fa433624f559b0f040a2889a292651cb02e780b718b3292aa5f3626dc7b8a9d115cb6e3fdede97aec83b345f69d3d7ced9bec10c94dbe8a14a1f5d727b56e8848d51afcfe217566c4e9d5ca69900948ab5bb5a1564a2d12ff399234aaec5dcd9556a289610a7bba634c446e1cd045317e9b9dd705209cd3fd3ac1b5fc12835f77dc8751ac92a8f6edcd496660f89004a62503342adb8d9547b4a50c1c8424e3e01f69ca542b38657a86c0bf89dd4c4d436b5e639b91e04ccaf796f2e02a713748b2163c454bb82c492b5fe56d345404c965396245c5041b44e68ed40fed948842ef5d019330ec547b2e2786373761c00ce64157646282e41196556ad8059cb8d71a5cf9c1429a65217f3623e96fb183a370c1356959738da5e5035f7f3a48eb78e0525d2fd98cdbcf7e85cfadc315d10015db4921f6f9a822319bdc9bd66b303f3cdd5fd606599dad2753dbdbba6a3f8ebd546bc210904827393d5a994a066fad0c2f46dfbdd520c70de95c7fa391259ec08de5fbafe218d3235acf7b7520cb5cb742fa0c74bfd2d813c84b34bb2e7de690130ddae4742e307a84761491cc2e1b49f6145e65e4121bf2d1594b7594bb542c77f72ee9c5260a837aeb24238813d20f210411f887d94bfd1f83274c266d590d3009725a094cd1de96a0f93169f1ef12695cd6e2f259e8f3f80fc1529fb4021b7be6e450417d3e67d3d5bf98d289cc4328423974149cb9e8550ac8750da06f2c1bcd06bdba8f58c7e438cff6f49c167264e5ca80c1dd32f6a2b4b66d9ae770fe2f7014884142d240a66391b41309e4eb75cda198df8d192d8d01324de3a5d8dd64cbba3407321301435d96e5dd939840a90b2ce0b069c5c04e75c0c82add9a5be30930017e14051dc3bfbd62d4a0e6e88b3249837f8e79b563b7f62999c37e13fb0139b5f2f2acb8848bf87b910341def6920df08703f8a5888762e71ecb8d7e37fa3283f4a9459445b613398752c2a307c0b760d94383f585fa098b389127c5c35a92400d51d9959f9d2f63f1dfd1c3dd67ba7bce9dd9b59a55933b5f02e471a9fefe7ad1f14b91d53db65cab7849eeb17e1c09c3e2f63838e19c9b242bb2a43d7ab91f200111092ffafaaca1fd67a8d0595be9fd9281c00a1c88538bf419310e8089f16601054faad10bd130882f0fefd7d110034583cc1564c8a69e4eab6f793c6e612512d4eb4175dd3255e1a19061478409ce1f805f64abb299b629674e4278bd202900119c00b2e8e861f31fe8fff600acb487f7f3f25b8967b56006429e8f65992367d522161e6abd86daaf2f2a3a7d20ec509f39cff9dc30ab4c8893a7731a4983269015e0e9bceb4a3c92c51710da02b10043b97ee9acbbe2c9e71b186d0ccfb1f6ad4b9375b0f05775d8f0238154113072dd86d77c76d5ddc461e88621c79f9e5304e7de06032473993c57c53e118484eabb34fb1ff2fe3e5a4b0a5e13f80dd89126500e3ec092a3d557a933d9b874998f3880203382af334d6fbf52fdfc96b94b6cd649f8a1e7dc20253ae06edbbf02224a1166e4504d27630e1a2ace0d45a2748d5730033c15e64208f2374966b5df3e812e9e7204322a754d9c9a155feabb15b823062617ec9ebe74f6fc70dc459a39975a135bdc72640e819eb60a8170bf01054b8704c69350a820af160a3985158d2e1fe0fef13611c6132933796ef6ee82899dd8800081bd5640571d0ad2ce2fe3eab5f57447cce8674deb35ad731e188e6ee90c42c9094788a570cc6740b862dec07e697f6ed9ab32903862a76b476a066f533bd5100f1f3c1a194a976cb3da7f519e57770b3b14539a6841f01b96cfedea03fc07d347d8777ad51541e6ef52fbab34f8bccba740c1efd0a4f255c060b61171b5dd8fc18a6711bcab20f019c55b74a08eeac7f08ee0ea7dc2805f68d1c8b3d9a08552a00b132f80e45137e416a4da68883f80a6bf0c9525303f76cbca79ad4c1ef4816cb9c4867bca0b85ecb8d90fae9ea2a9a7ab3d72ec9d707d8f36de173b3fee7f5220024b9d0eb069fbb55a8fb15fc92060d3f83546e25b532ff46dd29091c751c9bb77845444276f36cdff3c40419d4b58034326e4904e363d19c0a014f456d9f55becb0fd0ee3774df2bb008ad63ca626ca216c7c004032b47adac3d286c0079290b0103db5c77a45c5b5ea4a20feedb81bd44cb9e3c5e1f1092d54e28a7f8f79a21f7bf60269ef0a6aea413abf1680282a61b1fb7f0896b8ff57f889b9b49eb21f2620168a3507e0872c5c00a2c9d7be502103bfe53a43834ffa7b2e8ca88314a323ffd95068a779430c89704a0a747ff8fcaabb67347aecb88663e004fb1d9723ffa1dbfd022d437967a063c8f2dc4459eb9f66e7d4c637b274c8511c7ca23bfbf154600a3f7add0866558708b352d04aa4983e2381b9e75fa93e91916d0a0fed5997ca113702be6c5c6f55c720bccdf5745aa3039fbf554908ea775a6e9437a9dbfd3c50131f0fc1a5f1ad7573da86a50dcb6ca71f85306836e8b567121242013e2322ecbf288a867dd8ee2db36ab0965ff3a6af7bcd8f0eeb794b241609a17a67be9bfa666e69cf4098a55a8966eb52c9045defb19b5a805fe303167445f30fd4b033f8f011dc49bf7fd2fe3fcf5fd5b1e382773e716710aa0f6e5e7f53e2815e4990f5df74035c298da51bba8e3afa5617f708751ae345d035489ac317d169401c02ecac6014cd723097056234b217459336e62acf81078b72cff0f502f9680a4a272c605cbf00d9b0988610b2eb74db31aba30137d4ba1427e790d1f27615d4c0b604d705b721fb7211ba04113f74d869112154ab8e37e92e37df18a5364ed0f0e379c161c019bd6c52067f829fa486adf5507d1d6e40c0144d498f9ecf7a82e3188cc7ec09349801f580de9e98235c1018018391b687d76b140f9ba67c91defc43c0c7e591401c3512df79bcb297481676f2149144fb2a26a65d1e4971c23627a823c86216254a96a3976380e9f6d2740234aaf21cb1e2b570e24b66c40dbb5d86e7339647b38e4b59fcf6784d0f3c378ca64025471b05d752e681e6969dc4f1fa11fdf600f6001fde4e356796c4eb76f92d52924bdf75340e4585758871814ad096d7af5e448b47f3823fdb6e37638b01eb620a62b84619e1566f2631ad2eb26ac88900d1d05fb00f23043cb334d7bc4a99606987c14152c1dcdd8bcda4ce012114f9651cf45ad29a14a37939149623431a4be887218bf71ed2ed4944f755710b9bad612a2811062fd27ac0114dff424f8b85b051d2e6a8e413bf1f10eda20a641d804f4da47834600f4b9e6430e3ba361a6da3822f41b1029058b9c9d0113cb39d6c7820390fbdcb52d84061dc7cff2e4fdf1567a9f8f761263da56ccbac4f73c13922f4066b3f01700dbbcac1022d6047fc74318377cca281a961dea3dffa2ed804aa65a94611df31aa5df25a601e78ba0213d70bff628acb09578e525cd69cef301d050a6731dbdb389e442144393eb2ff377b609b2af285ec6c8eb7ab79d99b02005632f206a60cd00dcf91fc7f5f7fad167eaedbd1a7b22662fe6687f57d6234e2ea823a17c86f3c26e1b6e6d0ff7a70fd4c024743d31661f3404f0a885d51bd0ecc32e1ddbcda408008332747b3561ffa03b934999d610565531c22076e76338b1509b348c14177661cefd76f23865ed8ce1a47bc6b0d8ecad11f995d52224978d44a9227e12ad2c85ce36d8826c1cf1afa7ac34c80e28ab92080299aa240cb21803f2e2be8d0955b501cc57ec3f922378f021edab0f2a878d0f92954c4cf8cdc76eac30009aa0dc56f6bdcacb7f456fa0e66dbae208af74db7d1c7031eea6ffd6aacc429b84dc98cecf017179ecb4f70a302e0a835856bedccdac0305570838661047407701c389f496f7cb232e88c381800efee046880e17c3dfd73c68853004d976c357a8ab311fdb6a1e8bb4bf95e142ed9ba0edc8b348f3bf7e903769bfd29a37843f67f78b9184f000136845a966750a4ca1b2f2e42632d9e4dd2dffe7ed077d3c7e57925fbf701379e9ae35d6cac928c2a01d533a1b959c22baba63c251efc21c572c28c32f034e5301f80b85d9acc30d4b719311b8e07db963f4f9dfb2bb0ff6a3806a6d0c21e5e9395840a2384642fa7eea1906f8479d1d3307acee976b0f488079f296e5829c5ee31840998120c60a4e667dbdb8286097f6bbb64936288bdce5765736eed0ca426901e39deb5f71db3d70ccb4d7f617b8feb2bef116e70a435a34adc4e731ddfe17689d9546c9d49aacc0ba8efd13f1bfe72179d94dd9cd990115003c539be6d2d6ce003f43026824147b461423f33ad57975590f3efb53d29382d0b6e24cf8db7dfa6d3c905aef8ed0c3e003be603ac530473b25043790d531e96d49e5d228db5f7484371f06f786633db553505d38fc26a8492496b6b073544c6f80e8dce4b22a8ef400f49d5c70022abee9f72add2098013e811432eeb4acb6eb37917aa5682e8463e12285d76d646538df71422a6bd77dadd63d0f2d4495a15290480f9bfe009b9fa5008728648982e0f754060d748ef36c7e840f226f87752c3b78b8d441b92b9e7ecbd012c0f52a30b10d754a66458f6e394438907c743d82384319bf41b64aef05b99adb77c74c65fec7edacad3fcd9d07e4d79d5ad57a4ef5db231856b8b2fffbf900ff54c4c766972c3b7e4766eaea1b94b7b5a36082c938e0d0bb6e876f30982cdd9946ffe6e1a021f882b9d9800620890da1dbd7734fcee9629a77b9151ac1463101ee2133a4269de74f85446709b100dee27f554ae9f1abbf1a3e0da0b398acf974d76f9fb1144f4eab310a34ac1f998b855aaf4b0a8af0bccc7b5bea290b453655acd0a4b6b59741b686ef9a8ecd65fa6c218cdc0414832df9c2b58d74bca07048262c8dff7b543625a2e7c47f806cf1db37a9c44a41106c9f3df643aa91d2a5301c3ea9cbabeed0554567d35dfa21d68c3028e19e75817a715c927232d6b4e788fda718700001000200473044022100ef7dc102cbce20331833717bdd2110600d09e6a648658574b901ad469db82676021f0f9ca89e397dd8c8e0f21cd0f875e1be1093171d60d9b7d1070b19e12e6551010021036941813b308c6c2f3e93b257418d145180b3106ece9fe55a92b360fa0a613ba4",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000002c7947d028961947fdfee1ba8a17a21657322e6b48248c09a82d2805e4a7b57780000000000ffffffff602acf5487a641397860e50f407d3a81a3cde4191bc99d9152a88d667914735c0000000000ffffffff0352c5eb0b00000000220020c277830d6929a33ed806026a236c2c3e60c5a93172607b0c33a20738ad04a2a3e1dcf50500000000160014def833f440a75687e6eb691f41c6b0de80d3de6ce1dcf50500000000160014df45472d3a477b578b4ef6c6211f95011eeb322200000000",
+    "cets" : [ "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0100c2eb0b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0203a99300000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bfd18580b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02648ec309000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b9c332802000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02ac5d0100000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b5464ea0b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0228307500000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bd891760b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02d25dd40b000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b2e641700000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0224617e03000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bdc606d08000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02c83e3f02000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b3883ac09000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02fab3690a000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b060e8201000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02cd66d003000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b335b1b08000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0276fcd100000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b8ac5190b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02fbde1b06000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b05e3cf05000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0277691205000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b8958d906000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff025b02ae04000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5ba5bf3d07000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff028ef65008000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b72cb9a03000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02e76dd309000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b19541802000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0246a17c03000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bba206f08000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0213e36604000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bedde8407000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02d3f38504000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b2dce6507000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff020e8d4205000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bf234a906000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0262886504000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b9e398607000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0294e5590b000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b6cdc9100000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0205896309000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bfb388802000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0296130e02000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b6aaedd09000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02271db400000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bd9a4370b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02f4f71a01000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b0ccad00a000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02d7b96d06000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b29087e05000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff025668c205000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5baa592906000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02ca93ab04000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b362e4007000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02800c0906000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b80b5e205000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0208cbbf04000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bf8f62b07000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff026680940a000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b9a415701000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff020ae66405000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bf6db8606000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff028c9c6f09000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b74257c02000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02022e5a05000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bfe939106000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff026ce6fd00000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b94dbed0a000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02d3a5bd05000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b2d1c2e06000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff029db72406000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b630ac705000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0238c03e09000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bc801ad02000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0100c2eb0b000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02e609d807000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b1ab81304000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff024f2c2505000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bb195c606000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0289491402000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b7778d709000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02b350c607000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b4d712504000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff026cacc309000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b94152802000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0223c66900000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bddfb810b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02b1707a0b000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b4f517100000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff023190cc00000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bcf311f0b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0259a3e209000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5ba71e0902000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0229d97908000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bd7e87103000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff025604af05000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5baabd3c06000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff026cbfe900000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b9402020b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02ee81ba05000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b12403106000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0234f52d00000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bccccbd0b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02b0788506000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b50496605000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02c5ca970a000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b3bf75301000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0281733406000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b7f4eb705000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02ba2fb206000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b46923905000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0240f86c04000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bc0c97e07000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02e9ccf400000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b17f5f60a000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02f35e2002000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b0d63cb09000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02c907d204000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b37ba1907000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0276541900000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b8a6dd20b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02ef76b504000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b114b3607000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0254276502000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bac9a8609000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02ff7fff00000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b0142ec0a000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02e864bc03000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b185d2f08000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0210c78c09000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bf0fa5e02000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02c7f6ce09000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b39cb1c02000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff023f03c509000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bc1be2602000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff025279d008000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bae481b03000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff022d61a402000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bd3604709000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0287f2bd0a000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b79cf2d01000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02848f4b07000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b7c32a004000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff028e515a01000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b7270910a000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02332ba105000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bcd964a06000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02cefa8207000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b32c76804000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02f3042d06000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b0dbdbe05000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02016c9f02000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bff554c09000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02fb7c4f02000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b05459c09000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02b63e1e09000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b4a83cd02000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff026b446907000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b957d8204000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02b4620d08000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b4c5fde03000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02f853c302000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b086e2809000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0285792301000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b7b48c80a000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0244110500000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bbcb0e60b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02161dff00000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5beaa4ec0a000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff028547790b000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b7b7a7200000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02881ccd00000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b78a51e0b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff022f350b00000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bd18ce00b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff027c075e09000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b84ba8d02000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02e10a2c09000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b1fb7bf02000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02f8037005000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b08be7b06000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02e5daed0a000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b1be7fd00000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0249d86f02000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bb7e97b09000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0291688108000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b6f596a03000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0288b24e02000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b780f9d09000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0245aba800000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bbb16430b000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff02480d2201000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bb8b4c90a000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff022c488406000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5bd4796705000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000" ],
+    "refundTx" : "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0200e1f505000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b00e1f505000000001600141bb6a99ecbd727e725885b827734af54ace23a9b01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000102c7947d028961947fdfee1ba8a17a21657322e6b48248c09a82d2805e4a7b57780000000000ffffffff602acf5487a641397860e50f407d3a81a3cde4191bc99d9152a88d667914735c0000000000ffffffff0352c5eb0b00000000220020c277830d6929a33ed806026a236c2c3e60c5a93172607b0c33a20738ad04a2a3e1dcf50500000000160014def833f440a75687e6eb691f41c6b0de80d3de6ce1dcf50500000000160014df45472d3a477b578b4ef6c6211f95011eeb322202473044022100ef7dc102cbce20331833717bdd2110600d09e6a648658574b901ad469db82676021f0f9ca89e397dd8c8e0f21cd0f875e1be1093171d60d9b7d1070b19e12e65510121036941813b308c6c2f3e93b257418d145180b3106ece9fe55a92b360fa0a613ba4024730440220073f10f812d88156843505ccc0ca051ed8ccf184513eafd825a4d5ea5173544702203b6129ed3cded96fdb25aef6b04ef279dee19f1fb5d5e59e172d2c1c4605de3f01210267b5a125dc7f2c330f5e004535b0dfddeba83a117e7f6e019f71ef35a1a480d100000000",
+    "cets" : [ "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff025604af05000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5baabd3c06000000001600141bb6a99ecbd727e725885b827734af54ace23a9b040047304402203c2e1e787831a56aefff7091e7a0f3b6296cb63be68ebeace6f2ad09a4d56f53022042b1abcc8153df3cd304ca11dc5ab0d8a8ed56e27d9f9ac6ad7d26536e289e5f01473044022055285ea3eef98d22d2f6dd486823e8cdc345a97cfe8284544342bd988772a76602200e98350b1f7892b6816864859ae4fc2a477a516239bde602c613d89d8a6daaa801475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000", "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff025604af05000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5baabd3c06000000001600141bb6a99ecbd727e725885b827734af54ace23a9b04004730440220394f36156e65a9040357616385bf65dc7a181c9b454f204324ca9a7f582d6fc80220226b1a1763ea6137fabc204a382c73eb61cb1d4e83367b956cac2b87503863070147304402203761487d040a796e4a1992744df2851f207bba25c5678e399f1dcb5b4ae0e9dc022075b99e19f8fecccfda0b99aa02daec9d99c9397a058c7072d168aec99a4bde8e01475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052ae64000000" ],
+    "refundTx" : "0200000000010187375a39afc15e0bf3b8293338b38a43af9edd9f22bea34acc2680687163736c0000000000feffffff0200e1f505000000001600141738d1ee1416f875a6545603e6f5bab4318d5c5b00e1f505000000001600141bb6a99ecbd727e725885b827734af54ace23a9b04004730440220262c8dff7b543625a2e7c47f806cf1db37a9c44a41106c9f3df643aa91d2a53002201c3ea9cbabeed0554567d35dfa21d68c3028e19e75817a715c927232d6b4e788014730440220696cb101d1fe2a4b0acd9354985f0caa883d19ef1956fe85ab82e665b61f81fa0220015a98a3c06547333e39324d331e2105847cb44dfe98f9ff8d42ef705e16d8e701475221031c14c2f323b3a00d34e6f2eebd8d981d45c26a72c3a52e17ad47bc5df81122be21033de458fa19d2b27f5c805c1650d62da78758ef212f2c29d5ca5c9aeb873f76c052aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "e1058b5e4fefda79bc1220d6f723f966d667a61262fe581349947e390ff8e036",
+        "nonce" : "95f28f499938afc884a1b90a0561248e64b6b25664f049443dfa9861353ccd4d"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-3166241189036115225",
+        "outcome" : "7be2e9d92e53ac52b08e641231fcfd852086d4c6b2fdb8a51301b13834ff9874",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-3967985064603185313",
+        "outcome" : "a631583d144681def62daf0dc552b3cf0a7ed5d56eceb8819c7d9d420824136d",
+        "localPayout" : 101773647
+      }, {
+        "preImage" : "8888997415239948099",
+        "outcome" : "e4d97fb3d06a7fb0e71f2426e72d456d753022bab845239ea77f167834597219",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "a631583d144681def62daf0dc552b3cf0a7ed5d56eceb8819c7d9d420824136d",
+      "oracleSignature" : "95f28f499938afc884a1b90a0561248e64b6b25664f049443dfa9861353ccd4d5d53fd872f2123dd6d2d72d086d01f01ec4646b3cf588bb3e298df46128a292b"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600142a960a289f2388068bf805ebab8d4a54355d6a5c00000000",
+        "idx" : 0,
+        "inputKeys" : [ "abcf5ed59eca475d2d5f2abce03967214de8cf9473d934d580164b4cb49eec61" ],
+        "scriptWitness" : "0200210202d2a8aad0e7d2f729099197332640f7577df8fe7279ca0caee16c1803d421b9",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qz0p9qkwcvgvcw5ywnwf0ll5wcg4f99d8wum00q",
+      "fundingPrivKey" : "3e0bb1dab9540259ce66ba8a542b84a4cd41bb2e6d1541831c05da841f28a64b",
+      "payoutAddress" : "bcrt1qhqgaycvn0e5pyw97y8gwvqh8xmd9vwu2f3kzt6"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020778d2a9a9aa8e7e02c6b613a06cdc55c093dc875d1c2d9c28d67de96c1645a2f00000000",
+        "idx" : 0,
+        "inputKeys" : [ "07bbd5e230cae3310535f4fe46b8b66fa95f84ac6d24810a027bcc308caaa8f9", "a714938409d0f77b3545f2c24b2b5c244ea554a6e31099cab90614b4d701446b" ],
+        "scriptWitness" : "01475221032a48dfca917094bb6ac440cad9dbc4813d0fe4b4998f412f64a5dbe7baa371b72103938f48dfccd1ae38499a8952ac561da6a69d403a83fae158eab210f79f629b4152ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qcmmqfxz8j77jgsd0agu7wj7cex8s0mw354ae30",
+      "fundingPrivKey" : "cb2105d81ddbbc890bc2341aac0ee2cd448aea66ad93829957fb0c92ce1dc14b",
+      "payoutAddress" : "bcrt1qfy52dehzv7hd9fcrtscexzhshrwnf6m0xjzhxy"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71056142d333136363234313138393033363131353232350000000000000000142d33393637393835303634363033313835333133000000000610f14f1338383838393937343135323339393438303939000000000bebc200fda71240e1058b5e4fefda79bc1220d6f723f966d667a61262fe581349947e390ff8e03695f28f499938afc884a1b90a0561248e64b6b25664f049443dfa9861353ccd4d0371ed7e2b36c1e7594ae8a6aa09e268cb8b7f090835bcc42afa55553a30aff95a00160014b811d261937e681238be21d0e602e736da563b8a0000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600142a960a289f2388068bf805ebab8d4a54355d6a5c0000000000000000ffffffff006b00000016001413c25059d8621987508e9b92fffe8ec22a9295a7000000000000000500000064000000c8",
+  "accept" : "a71c98d8d338ee83b2e095001ef6fffec1ff39206a34ce20cf35b5da3cec8535cff10000000005f5e10003dc9ebacac92463022936d8a8198693e1b1799d078837ff6ab47c05dd248aac56001600144928a6e6e267aed2a7035c31930af0b8dd34eb6f0001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020778d2a9a9aa8e7e02c6b613a06cdc55c093dc875d1c2d9c28d67de96c1645a2f0000000000000000ffffffff00da000000160014c6f604984797bd2441afea39e74bd8c98f07edd1fda716fd01e600da44f3e2c7b722775a13ed4d49cb59a90a9d3235db2f44822d206d6b4de0facb2cfe1e09f8ed5200aa3170a5bbad5a4503e066475a4f748fa5bcc63458212714002a29f6b58458f0fee651aaef24c4bfb8edc6f627e59709c1e50e6e07a19e699b12a664e51d065397cfb26b926999dcdf6ec7fe4925f49857a58fb14cd9346408a731cfaa6c8a5db2ab556f1ed5a95dd8ed7a6d213953dbf2ec4bf452e8baf134011089e0ecb12ab4c3da55fecd84e5241a80e122eefc439f401daae6352101073c074804f5f03e7bfc79ab0bf7a36830f47aa510cd7d2e6ab0ef4cbf43b021950701f71fc1139b46f5590e63406f60af81e90233af98b10616f62c6fd49f39acd13322a0aa5fc51e0be6bea6d3dfc066b1fcef52a020573207662d5f031b23a2b123d40a339c325ec8fae9628e34164bd7f048e22ab666d6ff261266053c0a57891300d7bae5ccd0df37cfda7280e26afc797bc41ffd70295c5768e9fe35d6711ec602cb0c36b0786bbf896733f1fba3722784094133e29462e3c7a5e32c31a211801c0057b02a0f2c9771bfaa167dd5fb1343af23294ad6488e291929bb76a2209fbae628f70ab8a756f3b3f9ac6be510495cf0e7696a366ffe0f85159eff1cb8eb99eb0865f5c352557b1ac262bc85105b4a7cbfe170b9bb4f85e927151d4fd362895211178591adffc8f75d076e9e836938f40edde868dea70ac2fb278ca12e931d3141e3801b546d109719e2abbdcb879f7014cb2af6a0754eee1b0aa1d98aae2f99",
+  "sign" : "a71e865cbf187376169263eeb4a1f5c1b852d28d1772c5c249ec049da29d9ffab523fda716fd01e60000304176075bea51d2056602619bdb31e671cefcbf7f92f94b2db0a6648bc6ca9db4811f8e7ce36069189771f6cd134aefbc7cc080253636b6a359442f0d16d30182323c3e9c8e0f06839491db7c173519494c1000605a09438a26051f72469b9f46c3cee0518ea94d879d702920acd16e788647ef1703eb8227ac55e88cf7653ffd11c62927404ca296f679e4d421e4499e4544b8f7df8882e1f48ab16993e052002000bc09c208b22a8bc4d3c59b20bd19e9af209da8ef588ebb2947f867977f25df01cd7b21c887f0db3288db4717b4fb3b8d294c6c21d839df188c974b102f6900fc2c17e21f5c46da792572de82d16baf969b31e0da2bbd8798112815f52090f6a8a6e0bdd615b51749bd3a0ddc21d1c260f22b87735069dbc94b60768a930ef8a487a73c09a7debc59dc4246598075e1e597758a206726469a258842e21fc677001d0acfda346aa4d44c2efc3f0b93b1734e8455228e01566fd01a5a9f193057af3558dd5ba5ed69a28103aacb3431107d0d79433dd75dc3c126f206429d4e1c030087d7c9903b801a6f52a8a02be6cd9aa4df9ff30c4e45afdd4073a195348276c6cfa4888b855fd3ffe92c6a0008b23e77af1fc31764a294d6da2d0e47675b1d5f72e8e9f2a5e131e310b432e16ef0ce0fb2abd1b0edd6ec3ec597fa681dbecc6a1a9dff4e3a32aefadd44ca39223ee49a6390dd237b127b9cd3cf5d6e95804e6d5d802cfc8ea21e4689b2c48076142970507e0c434f14a0853e03b670584d52fafda7187000010002004730440220760bc1aa952c071b696c1c0b7d6f92ef4577bdcace220f3965ef70e4be7fb7780220705bf461426f99d09e4d3c5b028dc0a3e657a05a26976d08d0d4f36e4c8caa610100210202d2a8aad0e7d2f729099197332640f7577df8fe7279ca0caee16c1803d421b9",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000002417dbafabac3b87d7f8471c4e0cd9fc6c1ff7f990ab70d408d87d696994961a70000000000ffffffffefdcddfe6952f53bd72ea06606b4cf3a293d55f872ce148b068309c070cfae8e0000000000ffffffff0352c5eb0b0000000022002076d5123fd4ff8bdfb38ba3e07dd05446a6254dc7f345abcb52059ac310ff65a6e1dcf5050000000016001413c25059d8621987508e9b92fffe8ec22a9295a755dcf50500000000160014c6f604984797bd2441afea39e74bd8c98f07edd100000000",
+    "cets" : [ "02000000000101d27acf1a719e47b1d986e20b467dadebad793f0a57aaeef672a4f59d206c841e0000000000feffffff0100c2eb0b000000001600144928a6e6e267aed2a7035c31930af0b8dd34eb6f014752210371ed7e2b36c1e7594ae8a6aa09e268cb8b7f090835bcc42afa55553a30aff95a2103dc9ebacac92463022936d8a8198693e1b1799d078837ff6ab47c05dd248aac5652ae64000000", "02000000000101d27acf1a719e47b1d986e20b467dadebad793f0a57aaeef672a4f59d206c841e0000000000feffffff024ff1100600000000160014b811d261937e681238be21d0e602e736da563b8ab1d0da05000000001600144928a6e6e267aed2a7035c31930af0b8dd34eb6f014752210371ed7e2b36c1e7594ae8a6aa09e268cb8b7f090835bcc42afa55553a30aff95a2103dc9ebacac92463022936d8a8198693e1b1799d078837ff6ab47c05dd248aac5652ae64000000", "02000000000101d27acf1a719e47b1d986e20b467dadebad793f0a57aaeef672a4f59d206c841e0000000000feffffff0100c2eb0b00000000160014b811d261937e681238be21d0e602e736da563b8a014752210371ed7e2b36c1e7594ae8a6aa09e268cb8b7f090835bcc42afa55553a30aff95a2103dc9ebacac92463022936d8a8198693e1b1799d078837ff6ab47c05dd248aac5652ae64000000" ],
+    "refundTx" : "02000000000101d27acf1a719e47b1d986e20b467dadebad793f0a57aaeef672a4f59d206c841e0000000000feffffff0200e1f50500000000160014b811d261937e681238be21d0e602e736da563b8a00e1f505000000001600144928a6e6e267aed2a7035c31930af0b8dd34eb6f014752210371ed7e2b36c1e7594ae8a6aa09e268cb8b7f090835bcc42afa55553a30aff95a2103dc9ebacac92463022936d8a8198693e1b1799d078837ff6ab47c05dd248aac5652aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000102417dbafabac3b87d7f8471c4e0cd9fc6c1ff7f990ab70d408d87d696994961a70000000000ffffffffefdcddfe6952f53bd72ea06606b4cf3a293d55f872ce148b068309c070cfae8e0000000000ffffffff0352c5eb0b0000000022002076d5123fd4ff8bdfb38ba3e07dd05446a6254dc7f345abcb52059ac310ff65a6e1dcf5050000000016001413c25059d8621987508e9b92fffe8ec22a9295a755dcf50500000000160014c6f604984797bd2441afea39e74bd8c98f07edd1024730440220760bc1aa952c071b696c1c0b7d6f92ef4577bdcace220f3965ef70e4be7fb7780220705bf461426f99d09e4d3c5b028dc0a3e657a05a26976d08d0d4f36e4c8caa6101210202d2a8aad0e7d2f729099197332640f7577df8fe7279ca0caee16c1803d421b90400473044022066bfa36a849780c609ae9e6c606c3f7080462722a84bfe9e17b9cd50962ffec00220094482769e4d690611c64ae4d621f9218587e80f8889ba926ebca058d759aba80147304402205ffe9b1c75eab764229d43bf5a71ea1a39e0bd754a2001521825792523283dd402203edf3286c7df3d9b50c0cccb396dbe983635ecc15ae8317b6259caaee56bb7e901475221032a48dfca917094bb6ac440cad9dbc4813d0fe4b4998f412f64a5dbe7baa371b72103938f48dfccd1ae38499a8952ac561da6a69d403a83fae158eab210f79f629b4152ae00000000",
+    "cets" : [ "02000000000101d27acf1a719e47b1d986e20b467dadebad793f0a57aaeef672a4f59d206c841e0000000000feffffff024ff1100600000000160014b811d261937e681238be21d0e602e736da563b8ab1d0da05000000001600144928a6e6e267aed2a7035c31930af0b8dd34eb6f0400473044022028fe7bf10e13f6eba8ad5445ae28e376c41ff7585e2baa09562873ec9e81659f022011f35cd2dff4e19d6dda47e6905bcb465ac23e922001a6ee54ca9d6fd1927bb30147304402201089e0ecb12ab4c3da55fecd84e5241a80e122eefc439f401daae6352101073c02202f573844fcfcbfca655a72a1190efc8dd9e26ad38325a4dda283e997a71c70cf014752210371ed7e2b36c1e7594ae8a6aa09e268cb8b7f090835bcc42afa55553a30aff95a2103dc9ebacac92463022936d8a8198693e1b1799d078837ff6ab47c05dd248aac5652ae64000000", "02000000000101d27acf1a719e47b1d986e20b467dadebad793f0a57aaeef672a4f59d206c841e0000000000feffffff024ff1100600000000160014b811d261937e681238be21d0e602e736da563b8ab1d0da05000000001600144928a6e6e267aed2a7035c31930af0b8dd34eb6f040047304402202000bc09c208b22a8bc4d3c59b20bd19e9af209da8ef588ebb2947f867977f2502204560d77d65e307287ce39dbd60638e74a043fb53bdce4e14e1bfd1c63044cda5014730440220055c30bdfdf4a12d4cb8cf7363f932f1c8d3981a39587b5d6d13f15db488a2de022009ba772e010a5735fe11d9445a48a0f6f08d5a4dd1df6eb38326dd4a3f16cba8014752210371ed7e2b36c1e7594ae8a6aa09e268cb8b7f090835bcc42afa55553a30aff95a2103dc9ebacac92463022936d8a8198693e1b1799d078837ff6ab47c05dd248aac5652ae64000000" ],
+    "refundTx" : "02000000000101d27acf1a719e47b1d986e20b467dadebad793f0a57aaeef672a4f59d206c841e0000000000feffffff0200e1f50500000000160014b811d261937e681238be21d0e602e736da563b8a00e1f505000000001600144928a6e6e267aed2a7035c31930af0b8dd34eb6f040047304402201a9dff4e3a32aefadd44ca39223ee49a6390dd237b127b9cd3cf5d6e95804e6d02205d802cfc8ea21e4689b2c48076142970507e0c434f14a0853e03b670584d52fa01473044022011178591adffc8f75d076e9e836938f40edde868dea70ac2fb278ca12e931d31022041e3801b546d109719e2abbdcb879f7014cb2af6a0754eee1b0aa1d98aae2f99014752210371ed7e2b36c1e7594ae8a6aa09e268cb8b7f090835bcc42afa55553a30aff95a2103dc9ebacac92463022936d8a8198693e1b1799d078837ff6ab47c05dd248aac5652aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "efad47318d519dbc79b444af1bc02d2c88476ded771a745b696096c60c61e6b7",
+        "nonce" : "223ed22715704332b77a1ec35bf3b9e947f35c155f74e1912b76a0dd1d9508b3"
+      },
+      "contractInfo" : [ {
+        "preImage" : "88936581455683470",
+        "outcome" : "9912b22d980c6ebf4b41f4142584fa789bf3dba599d8ac685e02f7ac762d58ee",
+        "localPayout" : 0
+      }, {
+        "preImage" : "6579088337026477284",
+        "outcome" : "10a4b5e49a76111a8faacbb8f99fcfdcd840f4a47ff8d33b204e88e72266fb5e",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "4226197881583608624",
+        "outcome" : "dd282c09287696d73b5e11497c1443b6099f7f56ece4bba1da32a70314f049b9",
+        "localPayout" : 5510252
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "10a4b5e49a76111a8faacbb8f99fcfdcd840f4a47ff8d33b204e88e72266fb5e",
+      "oracleSignature" : "223ed22715704332b77a1ec35bf3b9e947f35c155f74e1912b76a0dd1d9508b3284bce542b938780bfc5b5b6d81cc478a6c7c975ca3e2347729d42a13773a732"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014cdc81d3b00b0bc06f57f1073d8e149702f02f21400000000",
+        "idx" : 0,
+        "inputKeys" : [ "8ab3386c07cf863d32665b117607548227bc0eb841714d0dabbb2d12df258253" ],
+        "scriptWitness" : "0200210264c9fe28f0586db06de07254f62f0ef3a34effef87e8db45df99adc87ad7b772",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qyt7g72kv928hswh8k4schgddqlhkwfu7qr5wyu",
+      "fundingPrivKey" : "3ca540dbeede1b830584263eecec257c1f3b27df0a151b4de4bd8d83464169fc",
+      "payoutAddress" : "bcrt1q7adydwgvpy826kkymmx8qxd0rmwcwfmtac5yjy"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914aabe066a0981d7b48fdb1c124a1da4606cb687fe8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "93c430f8639302e320302e0b60a843dfbbad012292b61d4ae2bd826330e0d3d1", "fdc9cf09f766273d60da035930fa3630860933920413b8df4820578368936e17" ],
+        "redeemScript" : "0020cadafecde5fcc18cddbd1bcff7efb306c14754297f1058d106b45200cf7d5049",
+        "scriptWitness" : "0147522102bb493064aa0bf80b5914b8f14ea4f0103d71ee6fb3adbbec8d6fc88dfa3beacd2102ba28adadb61c9775cbb42dc9706d4903dd9ee52509ab10d093df440e45f225d552ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qn6ecj8xptada4f99p5pk5n3d92fxt479mqu0jj",
+      "fundingPrivKey" : "f39832fce9e9c2ae448d5ff6ac4b25c6fdea8585e9a3ae82cb691af5f2cdd215",
+      "payoutAddress" : "bcrt1qw2tyjmjlncfyldheehq00ycm3f23euqh9aeust"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105211383839333635383134353536383334373000000000000000001336353739303838333337303236343737323834000000000bebc2001334323236313937383831353833363038363234000000000054146cfda71240efad47318d519dbc79b444af1bc02d2c88476ded771a745b696096c60c61e6b7223ed22715704332b77a1ec35bf3b9e947f35c155f74e1912b76a0dd1d9508b30290e109f49253e70ad453101361ec326ac8f55bed466bed45f266269f7b51d04300160014f75a46b90c090ead5ac4decc7019af1edd87276b0000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014cdc81d3b00b0bc06f57f1073d8e149702f02f2140000000000000000ffffffff006b00000016001422fc8f2acc2a8f783ae7b5618ba1ad07ef67279e000000000000000500000064000000c8",
+  "accept" : "a71cc34826764e604828f3770c670d298fb557c1a492538dfead778c68729afa2c8c0000000005f5e10002a3de41213159dfe45e3c7a22af4952f92ebe89d5b6dc591d0af9f749c87028cb001600147296496e5f9e124fb6f9cdc0f7931b8a551cf0170001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914aabe066a0981d7b48fdb1c124a1da4606cb687fe870000000000000000ffffffff00da00220020cadafecde5fcc18cddbd1bcff7efb306c14754297f1058d106b45200cf7d5049001600149eb3891cc15f5bdaa4a50d036a4e2d2a9265d7c5fda716fd01e601a17a433e2be8d58d743b59e99fc8ad94c16d36a040cfc0a953be9dbaa15ebb23503cdbe17a11877e227c357e6a44d935c07f476e883e287bf7f9697fcc17237101c6ac2ef532c411225ac878d3fb34d81dcd4f13d49b11e38ed6233a53d57432a1b9b8ca8f72a7137b9a2a427448ddc5236fec3b054cd75fe49a48a4824fce6407fa49720c5a7c192f8b258fba9f0fd6baf2da4e702215492711a7f481bea9d885007c66a5e3e4ccc8e565d93fcfa334d696c94b0f711be2f5864d783cb48b6f0c6ec463f1a210ef6d3909fbf8322b01488ab6073a5eca78db2193bfc25617bcf71801c88c12aa50ae959b316de10fae43ff269d5efae58f3276ddca48ae5904d39730c32154f3a38e1790cdf6866acb9905c4b679299ae73fd1543d6215389eef89c85e94bd6170caec5d0d12a5d7131ab2eed37db8057d772ba01162a02b6b956af2018023a9ecbf99ac03fe99ef913ae8634b25ecd3b20c42914ecf15d34b89c5025e1cc0c671ab1a7f209c68d4362b9fe09d1b5858a71201a2cf4ccd9cf165cc16780159e3e03c3468a6a919b4d973ee0ca6e58d44f627c4d7523109d50e085dfd62623ac7f3d2eb255e9e013d50f418520069fbb3642b2ce2060d0b0f99de89841727362517951ad15185e18b1351774e4edeec5b117f961efa42aa0b9bd66c5a711155beae3a75abc05158f10bcf48e4003b5563f3d4543840a604163b7fc8925f0b10d35c05e5c1fe49d79492e3540998ba69ef25b229660f11e690a4288c0adfe3",
+  "sign" : "a71ebf58fb1cae733c342ea071b3c49152a93f0c95f36be26aa3124781185ed81f50fda716fd01e60130fb050f3053e234de589894176ffc8a6da969e190c73d15955f2f86d29de3055943548c75e73ce592a8160786793b948b49a34535418506be155414b7f9725a00969b8b08c809e82485f82344efcdad45ac29db3762c59d84ede44ef1d40dad0f08b872035b77b4448dcac00f5e0c8d995b2d88eeea567b2b56b252d9014f93015aa39c345006c27a8e51b254b119f3170040e2c63a3c013582b1e894f53dff66007f7011d25dc46e2ecd6114383e56dca9610a322f7ac1f6ceef94eafe215e89625cd8ccd912fdb6c79fa0a018830fb159d125177e73160a1b67129481a581887c0146cc45038264d8de3304f94fd7033ecfeb95a3b81693497762a096485f494cb8c94ba49648ebbef85c2a5063543b4fb89ecf1f8dd44ec7d6525506b07a157f8494a499c1b9ac352ae580766bc4be3df9f33631117dd27e3dfd6dbe12e777a43b006e38e48b7674c4abb0126b9e485e2917b75b0c28cec2ede0141d71129c7318494f4b15cdf3ed4d23922db6c24f77ac99a2a5e03bc1bb1c71b9d323d39fb8b4b8017251d9ea52fe86cf612b1da8b4e3e7c0cd037ce12d4f14002032f7076e4732d6d6fe0c6443a9db80ebcbbd8fdb53da8972326553f5ca56fb120ee8f37d3aa91d9f7f90b521e5120317b6fe5125a0e58c8f425f9495303e5e9a38607fe520f83c5745e6585c9fd7eb34a75ff2799676985c424b3b276d3995cd29dc1886e6ec507bf239d7e0535fff37284eb8510db30f35a5b8178711dabb4fd90db21ac763c1fda718700001000200473044022006a6478120083745effcc4666b893fce6bd289413340f2c35316abcc8df38f7402205b149dce2cfb8bf586578910c30e103d33e3070c1e4c56a9234428ff22e7fbf90100210264c9fe28f0586db06de07254f62f0ef3a34effef87e8db45df99adc87ad7b772",
+  "unsignedTxs" : {
+    "fundingTx" : "02000000025d58f542e7ab9145b67d9f1d6ce02defc6d28728a1f9402eafbb6f2bf8ecf0980000000000ffffffff80edf964b29161dfe58d370dec6d4d3eb32686db73b8cf47e1031b3e8b2713480000000023220020cadafecde5fcc18cddbd1bcff7efb306c14754297f1058d106b45200cf7d5049ffffffff0352c5eb0b00000000220020449648e584f410537f9372ba87acf97cbd924ace4e7941115cf8cc1ca166a49be1dcf5050000000016001422fc8f2acc2a8f783ae7b5618ba1ad07ef67279ea6dbf505000000001600149eb3891cc15f5bdaa4a50d036a4e2d2a9265d7c500000000",
+    "cets" : [ "02000000000101dc3322c46ae9cb650e946f386131cd681cddb8c9d47dd7dd1c7413e06add107c0000000000feffffff0100c2eb0b000000001600147296496e5f9e124fb6f9cdc0f7931b8a551cf017014752210290e109f49253e70ad453101361ec326ac8f55bed466bed45f266269f7b51d0432102a3de41213159dfe45e3c7a22af4952f92ebe89d5b6dc591d0af9f749c87028cb52ae64000000", "02000000000101dc3322c46ae9cb650e946f386131cd681cddb8c9d47dd7dd1c7413e06add107c0000000000feffffff0100c2eb0b00000000160014f75a46b90c090ead5ac4decc7019af1edd87276b014752210290e109f49253e70ad453101361ec326ac8f55bed466bed45f266269f7b51d0432102a3de41213159dfe45e3c7a22af4952f92ebe89d5b6dc591d0af9f749c87028cb52ae64000000", "02000000000101dc3322c46ae9cb650e946f386131cd681cddb8c9d47dd7dd1c7413e06add107c0000000000feffffff026c14540000000000160014f75a46b90c090ead5ac4decc7019af1edd87276b94ad970b000000001600147296496e5f9e124fb6f9cdc0f7931b8a551cf017014752210290e109f49253e70ad453101361ec326ac8f55bed466bed45f266269f7b51d0432102a3de41213159dfe45e3c7a22af4952f92ebe89d5b6dc591d0af9f749c87028cb52ae64000000" ],
+    "refundTx" : "02000000000101dc3322c46ae9cb650e946f386131cd681cddb8c9d47dd7dd1c7413e06add107c0000000000feffffff0200e1f50500000000160014f75a46b90c090ead5ac4decc7019af1edd87276b00e1f505000000001600147296496e5f9e124fb6f9cdc0f7931b8a551cf017014752210290e109f49253e70ad453101361ec326ac8f55bed466bed45f266269f7b51d0432102a3de41213159dfe45e3c7a22af4952f92ebe89d5b6dc591d0af9f749c87028cb52aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "020000000001025d58f542e7ab9145b67d9f1d6ce02defc6d28728a1f9402eafbb6f2bf8ecf0980000000000ffffffff80edf964b29161dfe58d370dec6d4d3eb32686db73b8cf47e1031b3e8b2713480000000023220020cadafecde5fcc18cddbd1bcff7efb306c14754297f1058d106b45200cf7d5049ffffffff0352c5eb0b00000000220020449648e584f410537f9372ba87acf97cbd924ace4e7941115cf8cc1ca166a49be1dcf5050000000016001422fc8f2acc2a8f783ae7b5618ba1ad07ef67279ea6dbf505000000001600149eb3891cc15f5bdaa4a50d036a4e2d2a9265d7c502473044022006a6478120083745effcc4666b893fce6bd289413340f2c35316abcc8df38f7402205b149dce2cfb8bf586578910c30e103d33e3070c1e4c56a9234428ff22e7fbf901210264c9fe28f0586db06de07254f62f0ef3a34effef87e8db45df99adc87ad7b772040047304402205d23e09b9709e1dc151c5d285d634ac6fa9e041dfbae7367c9cb3e9b2bcfef8c02206c147d14a20c8efebc4fca073b39a5369f576fbd9e2ba14182504689f2466b24014730440220772dd6b8e8c9e14b2cfb8ed25d0d755fe2ed0f021d59b48e365f682c7f40660e02205c313d75a8ef1814232eb7a5bffbe069d470f1b531ec38806ea888a10ffef09e0147522102bb493064aa0bf80b5914b8f14ea4f0103d71ee6fb3adbbec8d6fc88dfa3beacd2102ba28adadb61c9775cbb42dc9706d4903dd9ee52509ab10d093df440e45f225d552ae00000000",
+    "cets" : [ "02000000000101dc3322c46ae9cb650e946f386131cd681cddb8c9d47dd7dd1c7413e06add107c0000000000feffffff0100c2eb0b00000000160014f75a46b90c090ead5ac4decc7019af1edd87276b040047304402206de6d799bfdf03ac1d072b4b014b95d45e8f4a2f9c59233a464c748f9e55d1200220267ac9b8f8a38048fdcf699417abb977a67fdeaeafe0272c7270d88b3627755c0147304402207c66a5e3e4ccc8e565d93fcfa334d696c94b0f711be2f5864d783cb48b6f0c6e02200f742f9b88b4ece7221e1107f2e2f580f236a2509bcbfed5b26bbf8185dd7328014752210290e109f49253e70ad453101361ec326ac8f55bed466bed45f266269f7b51d0432102a3de41213159dfe45e3c7a22af4952f92ebe89d5b6dc591d0af9f749c87028cb52ae64000000", "02000000000101dc3322c46ae9cb650e946f386131cd681cddb8c9d47dd7dd1c7413e06add107c0000000000feffffff0100c2eb0b00000000160014f75a46b90c090ead5ac4decc7019af1edd87276b040047304402207f7011d25dc46e2ecd6114383e56dca9610a322f7ac1f6ceef94eafe215e896202205abceaadfc36e5785fa26b4a0852c0d9c7b2fa342f140712a1d33da4af550ce20147304402206426113c7c088ce16b78b9bded64e47c0f58505b8f0ae80fe220e86a6f873a0d02202ca45021217001327b574371527d091563eae99382aa9e3ee164b2a96ded43ff014752210290e109f49253e70ad453101361ec326ac8f55bed466bed45f266269f7b51d0432102a3de41213159dfe45e3c7a22af4952f92ebe89d5b6dc591d0af9f749c87028cb52ae64000000" ],
+    "refundTx" : "02000000000101dc3322c46ae9cb650e946f386131cd681cddb8c9d47dd7dd1c7413e06add107c0000000000feffffff0200e1f50500000000160014f75a46b90c090ead5ac4decc7019af1edd87276b00e1f505000000001600147296496e5f9e124fb6f9cdc0f7931b8a551cf017040047304402205745e6585c9fd7eb34a75ff2799676985c424b3b276d3995cd29dc1886e6ec5002207bf239d7e0535fff37284eb8510db30f35a5b8178711dabb4fd90db21ac763c101473044022055beae3a75abc05158f10bcf48e4003b5563f3d4543840a604163b7fc8925f0b022010d35c05e5c1fe49d79492e3540998ba69ef25b229660f11e690a4288c0adfe3014752210290e109f49253e70ad453101361ec326ac8f55bed466bed45f266269f7b51d0432102a3de41213159dfe45e3c7a22af4952f92ebe89d5b6dc591d0af9f749c87028cb52aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "8b8c161b10f1090ddee66f9c0aa3b703d9676f3df01015a12e1fa5d8fc2c208e",
+        "nonce" : "14b9b24100c24c56e7c131166ace0c5a78bf9fa3deb1c177877f6641eae9468f"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-6321717816779108373",
+        "outcome" : "8f7c4b70f77ddcfe4772fb68fd5143f181770e7a2d7befa3d0126e7283ff9465",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-2663261188076012744",
+        "outcome" : "6e0ad4978a3289d0d05ce52b65afa2678ca5aeafb2fa63bf14c62708bca1fe55",
+        "localPayout" : 59782653
+      }, {
+        "preImage" : "3750731295888684092",
+        "outcome" : "0103bcb6dd7c8c991c78ae4c12f2eb3bd074b6c3778fc8e7cdf8675bc808fbda",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "6e0ad4978a3289d0d05ce52b65afa2678ca5aeafb2fa63bf14c62708bca1fe55",
+      "oracleSignature" : "14b9b24100c24c56e7c131166ace0c5a78bf9fa3deb1c177877f6641eae9468fd3e656e5b8e94145b346defa5a6d60000e3df0ac68356efe1f3a734428848790"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020988780629ff1261db52560763122ac7426147d4867307dc682f2fe0736f7dc6400000000",
+        "idx" : 0,
+        "inputKeys" : [ "89dfe7569a5f3948e260b088bb1d9bb9f55b0a35803c15e5d373ddbf4694ff78", "9c77ac9c44bd317c5ae41270a6a5253bcb9b2ef65d16db3e102edb379d399381" ],
+        "scriptWitness" : "0147522103264ffb1b96fc73ddefe5bf2d084cc125c9714398aacddb5ee44e613bcee7519b210202fd48abdd136152b8942fcce63b5d1c621413f340e067be51f296471cfcef5b52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qe065l8rannxns0zhwesrzay5j8afsff25xtxng",
+      "fundingPrivKey" : "561e9628fe73b92f7ec079fab958423cd59b87e193e580fec8a024cd551aaa2d",
+      "payoutAddress" : "bcrt1qu0k6ztglvz0vhwwne2d4ttavs5kvzk4tz64nsc"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ee1ee99275a35d6c7e3fe7c2e8037945844ad41d00000000",
+        "idx" : 0,
+        "inputKeys" : [ "c47c00c095c8458703859ed1fa084525c584ceae632783e224bd5380494222ab" ],
+        "scriptWitness" : "020021026ed30e4c5cf7d95b31fecaa790f42cc96d195d0077256a0a747e3ef622d300d8",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qgn60v5uadhq0e3h6znc46hxhvazfx6yclk6004",
+      "fundingPrivKey" : "9f53d93a2975e9c919c93ae998a67ed0b5d4cb8d304ec0ae6a2f935692dad758",
+      "payoutAddress" : "bcrt1q3kakhv2kc06qqflk8pdayum7aur43q7zul2730"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71056142d36333231373137383136373739313038333733000000000bebc200142d3236363332363131383830373630313237343400000000039035fd13333735303733313239353838383638343039320000000000000000fda712408b8c161b10f1090ddee66f9c0aa3b703d9676f3df01015a12e1fa5d8fc2c208e14b9b24100c24c56e7c131166ace0c5a78bf9fa3deb1c177877f6641eae9468f02fc39a8cc8cc373b3e2ca38b70281472139868ee403d5b57f0694c941b050624d00160014e3eda12d1f609ecbb9d3ca9b55afac852cc15aab0000000005f5e1000001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020988780629ff1261db52560763122ac7426147d4867307dc682f2fe0736f7dc640000000000000000ffffffff00da000000160014cbf54f9c7d9ccd383c57766031749491fa98252a000000000000000500000064000000c8",
+  "accept" : "a71cc08bed636c885402241f1fd247eaabc5f8993e3a2f90726cb88445d898cb8bdb0000000005f5e10002e8a69091e21a40b12b3bc902dba44fdf1c6a9201a1a5682b07b0e77d07277899001600148dbb6bb156c3f40027f6385bd2737eef075883c20001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ee1ee99275a35d6c7e3fe7c2e8037945844ad41d0000000000000000ffffffff006b00000016001444f4f6539d6dc0fcc6fa14f15d5cd76744936898fda716fd01e600a13d69387fc64770e6c4198b16fd254460f3661898ee4f5e121a9424f2058741c52bf5c240bf0db7a65947ac184dc27a10cb6a9655967a771b6e30983cafdd4d00aaf0ed00d10aea79da66e1d009e524db090d53b764123027eed2bab424f477326f8cf7112919c1f45f3f0a6572cd543683a254e837575fa0ee91e00e3e0076bb3cf06576e2ba2b530bc62fef8d4a90af45486fddfbb2dacc75029fd557c74efc009573ed8f4cb5a06ae101f3e061f060dbeda381d181b52eac8a9ab1a2e46f59879469893f0324207d9f83cd8d23ec0bf18c264b3b60a06ffffbcdb3c9551e4e1d005f6882273f91d7019e5aed23a85bdd642a6416b3d1ad1f6f182e5cc3e1bfbe331a8852c43d201b39ed20517793a6f1a9d9e236fc86f31c1392295d77b97207a592f11dd8add52da7a52bcb83d815925b89c5bbbce8bb54066b90fdbe93cb06ea001b7449cd7d5865fa2e54fcfd8e3199b3edd48478bd076e02b5814e0c8baa12b159f82fdf86cb2ef16991e1e0534aaf94a1b9f60965547310a2fe77602c5bd863010dd87455e7b538df52262e14cb77db916ba898aab8f66489905021f221d85c09af15314b83b05325f17e8eaacd9b3b38c7e183053e0df7d1c5e12d1b84cede10baf1d3980a83697e95a2ed51aa3b9b24d4cba9270baaf8903b28e87b2c659d0c3330f7024bbcbcf5791262f3743d0f8ff31ab2f243584e58023cae6a8179f39178e105a43429cefee1f257c7f15334a81b30e9cb7cf43715b7d6084513d6d702",
+  "sign" : "a71e9e894b8eea5ee299a0fc8d2c230f64f2b7874fef2d40c5c1ff0d002e824d108afda716fd01e600a060782376facd35c672a1281929cd49d871506c53ad389a45a21f34a227cb91331db20ecbf377674859723989ae80a66bf0d5b9e70be9a84d94d90179a3964901660cbff9ced7d68c430505cc0c88b9127750080821152fbdb06afef2fd4abc421186f448ae691e04844d21a85eda6fd4b0ee7d95da02f3ce327184e2a5ef4b7462fdb63388dae8ea337ddbd66424294427e3791758c87f9d2f4e89c5d8e0c3a0000b0571498f2d86283627843e7a4932b501666da117c9d9998c679890740bcbce7fda174878fb5e96ecb63f2619f6c1fb5811fdf16fad1cd8737de01ba907a3d0004f82789a41c3e188ac0b11ec47ab25a3183ae464f3faf35f6fa29cae1c4969e6afee3f14d8020c6bea9f91a3fd03bb45089462c01f2820398a66570a476078baa93c4202bea21a5608fa81f5432fd1186b95b01f0ba2f9af6015a7b5c2950e970053c617d1aa225b31632b49ac5cd680b0a3ae85e7820ee1b58234e8f9aed1e525a1f558b9153dcf51db252fc16e6e63a68261b5ed7193790f388023a82358855b016b0e99fe04f4bbe9739ac0ff0f0af4b3fdff25b8c1ed714a4e4a4214f3dc1ea5fe3b858e6af9a1ad4656fd2e615203fc0ba3897baab639a6439242b83fe2895adb419b245a82b63981cc4578d0168af9eef623e5c46854e0651e08e06168d1051bf15d135fd91312a9fc02506d7e8911164bbc20d5dc8d21612aec2d46ff6e037398cbac25a12bf32d91dccc638c660dbefb56b3833904adf6ba57feadda8940fda718e1000100040000004730440220153bb885a67c67829c5ba97d456222ff01c34c6e290c1a2396e076d54519e9580220225ceb8cdacd46c60f2efb61ce734e964490f08614cb2bec0d7ac5fb620e197c0100473044022004eb54bd087388367e3c151d7fb01410adfd9b9e15a6c78f95c6392798e84749022024bcaf5ebfd99debb0f25c2383e002fdd6d67cbf1a47f825d382c066fc17b5a3010047522103264ffb1b96fc73ddefe5bf2d084cc125c9714398aacddb5ee44e613bcee7519b210202fd48abdd136152b8942fcce63b5d1c621413f340e067be51f296471cfcef5b52ae",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000002ff7069426d2a89341712af7992c9ad539cad9772370139ba739beb36c1490d9c0000000000ffffffff6f52f488eff2a801b3490a0df0be1814e53b9adf2657fd12701763f71935246d0000000000ffffffff0352c5eb0b00000000220020328a2d38bcf118f1b7b7a7f097a6c1ec707b450e334d69fba2269b8d372547a055dcf50500000000160014cbf54f9c7d9ccd383c57766031749491fa98252ae1dcf5050000000016001444f4f6539d6dc0fcc6fa14f15d5cd7674493689800000000",
+    "cets" : [ "02000000000101519b861af6458947adb7d002d5711e4f37cfe564fe92e3849bb6d686eda6025e0000000000feffffff0100c2eb0b00000000160014e3eda12d1f609ecbb9d3ca9b55afac852cc15aab0147522102e8a69091e21a40b12b3bc902dba44fdf1c6a9201a1a5682b07b0e77d072778992102fc39a8cc8cc373b3e2ca38b70281472139868ee403d5b57f0694c941b050624d52ae64000000", "02000000000101519b861af6458947adb7d002d5711e4f37cfe564fe92e3849bb6d686eda6025e0000000000feffffff02fd35900300000000160014e3eda12d1f609ecbb9d3ca9b55afac852cc15aab038c5b08000000001600148dbb6bb156c3f40027f6385bd2737eef075883c20147522102e8a69091e21a40b12b3bc902dba44fdf1c6a9201a1a5682b07b0e77d072778992102fc39a8cc8cc373b3e2ca38b70281472139868ee403d5b57f0694c941b050624d52ae64000000", "02000000000101519b861af6458947adb7d002d5711e4f37cfe564fe92e3849bb6d686eda6025e0000000000feffffff0100c2eb0b000000001600148dbb6bb156c3f40027f6385bd2737eef075883c20147522102e8a69091e21a40b12b3bc902dba44fdf1c6a9201a1a5682b07b0e77d072778992102fc39a8cc8cc373b3e2ca38b70281472139868ee403d5b57f0694c941b050624d52ae64000000" ],
+    "refundTx" : "02000000000101519b861af6458947adb7d002d5711e4f37cfe564fe92e3849bb6d686eda6025e0000000000feffffff0200e1f50500000000160014e3eda12d1f609ecbb9d3ca9b55afac852cc15aab00e1f505000000001600148dbb6bb156c3f40027f6385bd2737eef075883c20147522102e8a69091e21a40b12b3bc902dba44fdf1c6a9201a1a5682b07b0e77d072778992102fc39a8cc8cc373b3e2ca38b70281472139868ee403d5b57f0694c941b050624d52aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000102ff7069426d2a89341712af7992c9ad539cad9772370139ba739beb36c1490d9c0000000000ffffffff6f52f488eff2a801b3490a0df0be1814e53b9adf2657fd12701763f71935246d0000000000ffffffff0352c5eb0b00000000220020328a2d38bcf118f1b7b7a7f097a6c1ec707b450e334d69fba2269b8d372547a055dcf50500000000160014cbf54f9c7d9ccd383c57766031749491fa98252ae1dcf5050000000016001444f4f6539d6dc0fcc6fa14f15d5cd7674493689804004730440220153bb885a67c67829c5ba97d456222ff01c34c6e290c1a2396e076d54519e9580220225ceb8cdacd46c60f2efb61ce734e964490f08614cb2bec0d7ac5fb620e197c01473044022004eb54bd087388367e3c151d7fb01410adfd9b9e15a6c78f95c6392798e84749022024bcaf5ebfd99debb0f25c2383e002fdd6d67cbf1a47f825d382c066fc17b5a30147522103264ffb1b96fc73ddefe5bf2d084cc125c9714398aacddb5ee44e613bcee7519b210202fd48abdd136152b8942fcce63b5d1c621413f340e067be51f296471cfcef5b52ae02473044022045583f67dd343362e95d3070d09810c3a912fbdca0fecdabe3131fd40454956602207ad8d8ebb51999995b897b57c4937ca7b7d2bcac4f74308b56432d598c41bfbe0121026ed30e4c5cf7d95b31fecaa790f42cc96d195d0077256a0a747e3ef622d300d800000000",
+    "cets" : [ "02000000000101519b861af6458947adb7d002d5711e4f37cfe564fe92e3849bb6d686eda6025e0000000000feffffff02fd35900300000000160014e3eda12d1f609ecbb9d3ca9b55afac852cc15aab038c5b08000000001600148dbb6bb156c3f40027f6385bd2737eef075883c204004830450221009573ed8f4cb5a06ae101f3e061f060dbeda381d181b52eac8a9ab1a2e46f598702201cc9364a3737b7551c1fd36ba76fb7c2352c90544adf6931e4c1ea1ebdefcd7d01473044022057acc187c3ad029fd3a729b7a32243f3aa4b7b4863dc61efe42c4d4c98320a7002207a553ee7e3aa9dfde02fee9295926110e95fcf37bf84093bf8ae95021b2195b20147522102e8a69091e21a40b12b3bc902dba44fdf1c6a9201a1a5682b07b0e77d072778992102fc39a8cc8cc373b3e2ca38b70281472139868ee403d5b57f0694c941b050624d52ae64000000", "02000000000101519b861af6458947adb7d002d5711e4f37cfe564fe92e3849bb6d686eda6025e0000000000feffffff02fd35900300000000160014e3eda12d1f609ecbb9d3ca9b55afac852cc15aab038c5b08000000001600148dbb6bb156c3f40027f6385bd2737eef075883c2040047304402206ea9dfba5e534b6ba3f5a295e18a4d115e3a85f728a398ff02234b5cf216fbd3022058f09ad02a064c8cd19963e8a111e1e79cce2b79ec62eff9ed4ec5fb4aa17f370147304402200b0571498f2d86283627843e7a4932b501666da117c9d9998c679890740bcbce022067cada04ed415d26a58e0dfd80b2fe01d18dbb7db154d70c0328a32c739100870147522102e8a69091e21a40b12b3bc902dba44fdf1c6a9201a1a5682b07b0e77d072778992102fc39a8cc8cc373b3e2ca38b70281472139868ee403d5b57f0694c941b050624d52ae64000000" ],
+    "refundTx" : "02000000000101519b861af6458947adb7d002d5711e4f37cfe564fe92e3849bb6d686eda6025e0000000000feffffff0200e1f50500000000160014e3eda12d1f609ecbb9d3ca9b55afac852cc15aab00e1f505000000001600148dbb6bb156c3f40027f6385bd2737eef075883c2040047304402203330f7024bbcbcf5791262f3743d0f8ff31ab2f243584e58023cae6a8179f391022078e105a43429cefee1f257c7f15334a81b30e9cb7cf43715b7d6084513d6d7020147304402201bf15d135fd91312a9fc02506d7e8911164bbc20d5dc8d21612aec2d46ff6e0302207398cbac25a12bf32d91dccc638c660dbefb56b3833904adf6ba57feadda89400147522102e8a69091e21a40b12b3bc902dba44fdf1c6a9201a1a5682b07b0e77d072778992102fc39a8cc8cc373b3e2ca38b70281472139868ee403d5b57f0694c941b050624d52aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "ccdfe2fd6671fde4ed3bb779e0346e62d7ab6913ca8395f2429f9eb1f0355291",
+        "nonce" : "ddc1fa40008599dfe15bf8cd2d6034e9126d892a1995175de5f9bd584a79fb40"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-6670398831353200530",
+        "outcome" : "32c471de4667b6710493b1fa0a2c5097d9b2d107ffb34a88e32f8cc838040b7a",
+        "localPayout" : 186885491
+      }, {
+        "preImage" : "3247156887161545184",
+        "outcome" : "4b3c7a243f6757a5608563afd1de54060924dc6f989fc5f69823f869015a6cdb",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "8374446065589035623",
+        "outcome" : "a13868215a9ec25f31478ebc243472b9b1e1b1b7e44e015b4df48a831417a7dd",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "4b3c7a243f6757a5608563afd1de54060924dc6f989fc5f69823f869015a6cdb",
+      "oracleSignature" : "ddc1fa40008599dfe15bf8cd2d6034e9126d892a1995175de5f9bd584a79fb40f5fa1b3d5d2d2ec1a10b4362bd9e9f294f5824124f10e08ea1e3d37a0c674401"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002071c29dbf76b82451bca65840799f80259f7a4b889aece515ccbae892c08f1db600000000",
+        "idx" : 0,
+        "inputKeys" : [ "ae01d772943baed6b6db7c378e2cb787e0e3950988f34a2a6933917a830b931f", "0a54458acc6c950ce47ebb6a8c39ce969b82474aa2a320ecb332d1f1dddd81c7" ],
+        "scriptWitness" : "01475221039d0d418f17e1af389b79842627ee52f7308e00d00b3671bdc713d044f18cb02321029f4b47ad3ff55e9498f10d6aa5a1e6a88f5620013ae2ac57137fb4cd01cc18dc52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qsvgsf8e89x4sjl8jten3vezfje9ck3dhm3aja2",
+      "fundingPrivKey" : "eeb1f339a0203f7e7d27b4a75199ef2f75ea6fb827182032afeb94ca5e616a83",
+      "payoutAddress" : "bcrt1qvqkkdp7twcckh0gfk0jgnvqfu8hyfl9lgtykmp"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020a98ddf20bfd36593e1c6dab592678f02bfe7421a89a762fd31c108c0c000dfa000000000",
+        "idx" : 0,
+        "inputKeys" : [ "78a1e4caf0d343c2cd8f1bfe08e0c327130bc614b4bad0ecebaa0efa51ab01e0", "37fc9c237e6f5627ee8eb089dab4f78eed972a404e92376822967c508522f380" ],
+        "scriptWitness" : "0147522102c85acbfad3590686b52caa16eb3362cabecfff1e5b80a10cb22132b86d00bf5a210335cf81a685250e5f046c2010c5920a31fba9ca6fb604aeae0109d0995e16a2cc52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qmyx3qa4jef306junuyp5q0mg2q494tsrqkyf3w",
+      "fundingPrivKey" : "814f8f7f3ef46bd30b830314a4b404e5d714ace638897531c9f180a7771564c9",
+      "payoutAddress" : "bcrt1qmwyv8eflpjaf7s2zlywrmjyhaj7smmdw3nuz9t"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71055142d36363730333938383331333533323030353330000000000b23a5731333323437313536383837313631353435313834000000000bebc20013383337343434363036353538393033353632330000000000000000fda71240ccdfe2fd6671fde4ed3bb779e0346e62d7ab6913ca8395f2429f9eb1f0355291ddc1fa40008599dfe15bf8cd2d6034e9126d892a1995175de5f9bd584a79fb4003d7d18b1e2adc982c3bc48c3f7abfd0fd0ab553e6261ac9e21718ad09929b3c6b00160014602d6687cb76316bbd09b3e489b009e1ee44fcbf0000000005f5e1000001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002071c29dbf76b82451bca65840799f80259f7a4b889aece515ccbae892c08f1db60000000000000000ffffffff00da0000001600148311049f2729ab097cf25e67166449964b8b45b7000000000000000500000064000000c8",
+  "accept" : "a71c46c2e6bb7e378fc07f58eaf889e96976d568e90bd20030cf9cac97e0de47e59a0000000005f5e10003cc820340f4288ebb15264abdefe984bb78d2d4e6dee9a01194d11d2959d913d600160014db88c3e53f0cba9f4142f91c3dc897ecbd0dedae0001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020a98ddf20bfd36593e1c6dab592678f02bfe7421a89a762fd31c108c0c000dfa00000000000000000ffffffff00da000000160014d90d1076b2ca62fd4b93e103403f68502a5aae03fda716fd01e600c5b392e803a0569550d1f4cb0da23cfb63413d1f460f2f9c79001340f3f0451b796e518e012f81d79c1b554f44479dc660476ae6591623ee379659d38e439456006291926ec619ba131251817a695bb11fd314ddda7dcef82593130e5ebac13d0ed17640565aed71c793c2bcb089e693d4b267a58513f7af1ee1c81698fda7010cf3d1d9ddf013d087b014f213e8a9b9704c4755ed7f54fe289ac8c933e38b10b8018b18d8a55e0ea773d158c2ebd781c82f2ebd2617bf203249f406ec0179701f31707c33111f8f72393768788b230334db149787e8cada7cd447a73cc221a35fca005ae2d50da6894b3832f8977f7b879bc689475753c40bb910837e620d4b57516f32da47b31e37e35c32d201e37a96ae1a29dec28f5ba22eddca128318ebf8506f71752883cd071854830cce3281202e34972a1171c4bb3372ee95bf61a16f12a1010781d6afe755fcc71238c485bf592b6a7cb32f1c4922e270e58758940c37f3cf42ff2370fdf97c6845d6839a63c58bdc51d8cafc44b377abd1293071e6763b1201af1d409b55ef6b5336dfd5245e03338ca8781f65d49db98fb575369a726c38050ddb3f72e3d0c598550b9be3fc9460e968ad63cc7df8be00919a2c3b0889998eb3a6de0a3144e3bd913ae37af0439bb967562cbe2ffbe4ee3c06bb7993a908021f14a8d1bcfe47f53203c2916ed14df623d9b19e5b6a6a7678f1977fefd3fe3b3d1242895c45da4fdbddc81b3847d537a9a7b9dda1d877454900cea4f28d469e",
+  "sign" : "a71ec8c8b4bdfab5fc5a8a581646000e297339d063d68a4739c8609ec35e4178fc00fda716fd01e6007edc4caac246f8a2aae4e2c717e70c25f48dc6221387ea1f303a670db29f1fb0440ad67b57fc847d8b5a5c0677da283a9379ba74f85ca2705e8fd34a0afe1b8000535e8f178281ea944fbd87d4d3b869a5d2efaa44ba1ec5b403c055f4de16d9d8d3038a98771379dc2828cf571edefc26aca536668b38924e5f20948790f52a226280e461b8c7b47dfc8be28c152862c7e09dce82e8fc0fb66ffc94155aec281601b49638f437c6c1f70aab75648111de6aa504b6c8d0883d14fb367458327df55a3c33b2c699e5226768434846e991fec85a6488d017b1edbf28bf37dfa1bf9fbc016f596b36de83700e4477e8e5bf680e9ba605109453469da15f74c44214dde9cc779acd04546d4bcac79da13ed505387a31eea25bda451c43b37cb26e3ab046bfab7b18236fe59e224c5049a819c390d1ff97a858fe481cf9eddcca31a2adfe77013ff5af6f33b531fadf5d058a38dc0f4b3534b4a91441c188c27ba65402d4ef8036a18bab4a97336e0dc4de0440b9ebf29341803b8193672a6446483fe869970100867bc41066bd0bd13af104f6f204eb0d0e61a58a00914c974853b509efee661f10d5ac3041f073bf5445758d0ffa51a7450c53554cd88aa3637e5b9161b7ffcd36ef4d84052d4113ea490df610e39d08cf04211514d9f818f0b0ddc79290d4075ba555fddf54529e83afe62d23a5d5cbec68e09719d36414a7f4f7be58490d9e2cfad4ba7f30ea5743b7666a868dd62404ce18ec1af58ab0bd805855a381cd63fda718e100010004000000473044022020c6e03f6b92b14aa44416b593c27c844492b71dda15f5943cb3d8419f6a50470220406cace36d4d78dc7916d33ae89366b3deac2c0c3a8aa98364a62e08514452b20100473044022016da2d9cbd42126e2593b1ed8d5e607bb63f2efafcb98c555bb7b421cdfacf88022040554a92363ea0226b5cac9d970faa77aa17a829ed88d9b62e595d51fe53ef450100475221039d0d418f17e1af389b79842627ee52f7308e00d00b3671bdc713d044f18cb02321029f4b47ad3ff55e9498f10d6aa5a1e6a88f5620013ae2ac57137fb4cd01cc18dc52ae",
+  "unsignedTxs" : {
+    "fundingTx" : "02000000025a25f8f07239f5918e8c82f7b40a5dc32de71e1652c26e4a550003963da1b8690000000000ffffffffbb554a92295e25590badb374a15b074e6e0d2a7af6762ed7bf3b8d13d3138db70000000000ffffffff0352c5eb0b00000000220020ba90d8b109c9de6bbef261a4a664a446ef28c2e11243f9689d6d514756b13f6255dcf505000000001600148311049f2729ab097cf25e67166449964b8b45b755dcf50500000000160014d90d1076b2ca62fd4b93e103403f68502a5aae0300000000",
+    "cets" : [ "020000000001019a193f9fbe5432fc07094758dd8ab8ec0540e789befc00f59a73828406520a8e0000000000feffffff0273a5230b00000000160014602d6687cb76316bbd09b3e489b009e1ee44fcbf8d1cc80000000000160014db88c3e53f0cba9f4142f91c3dc897ecbd0dedae0147522103cc820340f4288ebb15264abdefe984bb78d2d4e6dee9a01194d11d2959d913d62103d7d18b1e2adc982c3bc48c3f7abfd0fd0ab553e6261ac9e21718ad09929b3c6b52ae64000000", "020000000001019a193f9fbe5432fc07094758dd8ab8ec0540e789befc00f59a73828406520a8e0000000000feffffff0100c2eb0b00000000160014602d6687cb76316bbd09b3e489b009e1ee44fcbf0147522103cc820340f4288ebb15264abdefe984bb78d2d4e6dee9a01194d11d2959d913d62103d7d18b1e2adc982c3bc48c3f7abfd0fd0ab553e6261ac9e21718ad09929b3c6b52ae64000000", "020000000001019a193f9fbe5432fc07094758dd8ab8ec0540e789befc00f59a73828406520a8e0000000000feffffff0100c2eb0b00000000160014db88c3e53f0cba9f4142f91c3dc897ecbd0dedae0147522103cc820340f4288ebb15264abdefe984bb78d2d4e6dee9a01194d11d2959d913d62103d7d18b1e2adc982c3bc48c3f7abfd0fd0ab553e6261ac9e21718ad09929b3c6b52ae64000000" ],
+    "refundTx" : "020000000001019a193f9fbe5432fc07094758dd8ab8ec0540e789befc00f59a73828406520a8e0000000000feffffff0200e1f50500000000160014602d6687cb76316bbd09b3e489b009e1ee44fcbf00e1f50500000000160014db88c3e53f0cba9f4142f91c3dc897ecbd0dedae0147522103cc820340f4288ebb15264abdefe984bb78d2d4e6dee9a01194d11d2959d913d62103d7d18b1e2adc982c3bc48c3f7abfd0fd0ab553e6261ac9e21718ad09929b3c6b52aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "020000000001025a25f8f07239f5918e8c82f7b40a5dc32de71e1652c26e4a550003963da1b8690000000000ffffffffbb554a92295e25590badb374a15b074e6e0d2a7af6762ed7bf3b8d13d3138db70000000000ffffffff0352c5eb0b00000000220020ba90d8b109c9de6bbef261a4a664a446ef28c2e11243f9689d6d514756b13f6255dcf505000000001600148311049f2729ab097cf25e67166449964b8b45b755dcf50500000000160014d90d1076b2ca62fd4b93e103403f68502a5aae030400473044022020c6e03f6b92b14aa44416b593c27c844492b71dda15f5943cb3d8419f6a50470220406cace36d4d78dc7916d33ae89366b3deac2c0c3a8aa98364a62e08514452b201473044022016da2d9cbd42126e2593b1ed8d5e607bb63f2efafcb98c555bb7b421cdfacf88022040554a92363ea0226b5cac9d970faa77aa17a829ed88d9b62e595d51fe53ef4501475221039d0d418f17e1af389b79842627ee52f7308e00d00b3671bdc713d044f18cb02321029f4b47ad3ff55e9498f10d6aa5a1e6a88f5620013ae2ac57137fb4cd01cc18dc52ae04004730440220546da8a6a0b679276264b615cbf24555805c75628d89ee7a4ca6123afd1c514402201f0dca06cf9edacde6124ffc282fa9685b968ccf5008f36bac388cb92574aeeb0147304402201f61cce0a8f2282dba69466565eeca80d3376a8f74013005bdc51431d5e87f9102205f67d5f170d010c35b2e563a3785a655c1257fd54846c6b7bb5d77d5ad30cc890147522102c85acbfad3590686b52caa16eb3362cabecfff1e5b80a10cb22132b86d00bf5a210335cf81a685250e5f046c2010c5920a31fba9ca6fb604aeae0109d0995e16a2cc52ae00000000",
+    "cets" : [ "020000000001019a193f9fbe5432fc07094758dd8ab8ec0540e789befc00f59a73828406520a8e0000000000feffffff0100c2eb0b00000000160014602d6687cb76316bbd09b3e489b009e1ee44fcbf04004830450221008b18d8a55e0ea773d158c2ebd781c82f2ebd2617bf203249f406ec0179701f3102200b955720a741cac988aef989eaf8621a576a8391c362fb649843945b441dad5c01473044022059a008e7f3dea76475f2d2666d61eed13cb2021a6d56477ae680df9d23ef77d802204ac156b519f4c417078f491660d9615d2fba2f5e85b36640f39a2c0928774dab0147522103cc820340f4288ebb15264abdefe984bb78d2d4e6dee9a01194d11d2959d913d62103d7d18b1e2adc982c3bc48c3f7abfd0fd0ab553e6261ac9e21718ad09929b3c6b52ae64000000", "020000000001019a193f9fbe5432fc07094758dd8ab8ec0540e789befc00f59a73828406520a8e0000000000feffffff0100c2eb0b00000000160014602d6687cb76316bbd09b3e489b009e1ee44fcbf040047304402201c29fc1a588f12ce0d2126466feb10dae078f907be9623aec57418ba7ac3146202203a13047b1d44fbe49881a66a6f6955a8e2d193c4d1a550ef56eff7d8060ab26101483045022100b49638f437c6c1f70aab75648111de6aa504b6c8d0883d14fb367458327df55a02203fc4dc44eea133e5983e7949d368ed1784b1902d4e8152fb17e8bd8a57077d8f0147522103cc820340f4288ebb15264abdefe984bb78d2d4e6dee9a01194d11d2959d913d62103d7d18b1e2adc982c3bc48c3f7abfd0fd0ab553e6261ac9e21718ad09929b3c6b52ae64000000" ],
+    "refundTx" : "020000000001019a193f9fbe5432fc07094758dd8ab8ec0540e789befc00f59a73828406520a8e0000000000feffffff0200e1f50500000000160014602d6687cb76316bbd09b3e489b009e1ee44fcbf00e1f50500000000160014db88c3e53f0cba9f4142f91c3dc897ecbd0dedae040047304402201f14a8d1bcfe47f53203c2916ed14df623d9b19e5b6a6a7678f1977fefd3fe3b02203d1242895c45da4fdbddc81b3847d537a9a7b9dda1d877454900cea4f28d469e0147304402205ba555fddf54529e83afe62d23a5d5cbec68e09719d36414a7f4f7be58490d9e02202cfad4ba7f30ea5743b7666a868dd62404ce18ec1af58ab0bd805855a381cd630147522103cc820340f4288ebb15264abdefe984bb78d2d4e6dee9a01194d11d2959d913d62103d7d18b1e2adc982c3bc48c3f7abfd0fd0ab553e6261ac9e21718ad09929b3c6b52aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "1843437c533c172737321ab32793bed2611dede3cc19d02967e9b71a2411dc7f",
+        "nonce" : "dc25eec4f6ae06b9085057814167496e559f695c26b392a93aad23a3915557b9"
+      },
+      "contractInfo" : [ {
+        "preImage" : "7336994503660712616",
+        "outcome" : "29248baa91e08a16843306051778cb61b1b51e4ce971d621aff8c7bd7a88ab6f",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "8083635881969776513",
+        "outcome" : "dd9b848523b0c960cddf62b592faf98ed2cbf5c3f8859642747b81526b299a1a",
+        "localPayout" : 147149000
+      }, {
+        "preImage" : "8924351600189408908",
+        "outcome" : "4cc6b54d53817a850aebe76a917b79854fa9b5d8761f81954c5ab52884e94784",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "dd9b848523b0c960cddf62b592faf98ed2cbf5c3f8859642747b81526b299a1a",
+      "oracleSignature" : "dc25eec4f6ae06b9085057814167496e559f695c26b392a93aad23a3915557b932eb7b222c221368d40d817fa50feeea3fee99fcd0c49aee83f03eda3dce601b"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002059e8fde0cef0faf06c8b3708f463e4c4a9d54819d6b11e5aaa870b6a6357ce2a00000000",
+        "idx" : 0,
+        "inputKeys" : [ "8bd56db5f6cd03390eacb99e561bed024d97b0d4e97f7aaf453f125d146db71a", "777c65d42df21ccfd2a06a8f695bca6e19363381671859e62ce8bf8aac024771" ],
+        "scriptWitness" : "0147522103d8002c89821382d05c0a80fc016ae0a128a42b5236d3290a33457d2917fa196e2103f1ae08e57685a5d94e7e30bc9df755ca20e13bebc40950619db35a9f0e14e72c52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qwscasmpquuzk3zrcmvq3kqwdlrw4ad285cwa6v",
+      "fundingPrivKey" : "c0ac720af81f21692897a2b574fcb136a6d2e2b730a326045799e38efe525680",
+      "payoutAddress" : "bcrt1qty0ecw7vxwpc3au0nt35q9xde8u0q2macp7w2c"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914a1eb2a0c348ab12769ff4667b3266127442db4478700000000",
+        "idx" : 0,
+        "inputKeys" : [ "fb7bea273d84b50b666543ea4a8643465ed38acafabd5e562aeeb203ba172487", "e6fb2779fbcd984d350de9948b5658889e24a7851c27f1d87a243e75b4d77663" ],
+        "redeemScript" : "0020febc3de1a4abad503a73606204c798d227cfce464deac52f3f0ec499cb5527be",
+        "scriptWitness" : "014752210251dd33c8dba756723252077b4d8b68426ac4d06d6cc93d73d64fb5f2807487f72103e8894b31e4c17f05c4b524603ce3a16542df8da878b2ad86086fa6743a4f40a152ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qt9tfvz5ankp5z5nk4dv39rl8yf8ln0ag6w74c4",
+      "fundingPrivKey" : "d259da243d253a200cb436f49aa097f64f6f8d85a1c1c27c3d477f8536b08ae1",
+      "payoutAddress" : "bcrt1q7jvwyf7fsxw9rnqrhw803pn02u6k55ayhpdc73"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710541337333336393934353033363630373132363136000000000bebc20013383038333633353838313936393737363531330000000008c550c813383932343335313630303138393430383930380000000000000000fda712401843437c533c172737321ab32793bed2611dede3cc19d02967e9b71a2411dc7fdc25eec4f6ae06b9085057814167496e559f695c26b392a93aad23a3915557b9034ac63c6ec36eed37b88e5c254f0c39607737dca047ca4a04ac6404dfb2a65bb300160014591f9c3bcc338388f78f9ae34014cdc9f8f02b7d0000000005f5e1000001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002059e8fde0cef0faf06c8b3708f463e4c4a9d54819d6b11e5aaa870b6a6357ce2a0000000000000000ffffffff00da0000001600147431d86c20e705688878db011b01cdf8dd5eb547000000000000000500000064000000c8",
+  "accept" : "a71c126b3d665f9ab19207980c9b339f27b2ea0d37aa9f836cbd1431cd4436358e1a0000000005f5e100026662373fa09df2bab7a84b91934133abf3607a981b3965da978f63ff302b739600160014f498e227c9819c51cc03bb8ef8866f57356a53a40001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914a1eb2a0c348ab12769ff4667b3266127442db447870000000000000000ffffffff00da00220020febc3de1a4abad503a73606204c798d227cfce464deac52f3f0ec499cb5527be001600145956960a9d9d83415276ab59128fe7224ff9bfa8fda716fd01e601bfe5d8b4cacd68402c1768ccdae750c1b8006ddbbe31b9260877c84e62c58fbbb0c0e64f104b3db4aedda032c8dbc26880cb0d45e3eef7e4eb866b189a927faf00f4994364e20a50e5668cff974bdb9d3c4325ae2b116483814531fad618ce8b21abd4fe5246e9ec18840a03cc930d13cb8b9f28ce421c34348a625d19ecaab6e45830bc3a395ff02481dfa608740e2cd327c311bd2b5715d1677f72811956630301f830392fa17553c8e874a654334fb25f389cd4f5965a5e46aa5838da0553deeef28449bbf6816490bdcd7ac1f72fe3ecda9733ed2c8e180cf91508d94616839f009d7d1a7707d62b67a5ca747c8db345146fc4f623b88f1caf90410ce6963c6140425e6b0343ceac7b3ad9ab34f9d5b9b0db14ea662142125094ee480bbe61957f5e11abc0954615957373b9cac0fc0724382717ed0167862ec3abbcab5d94244000b3ce40dd7c630acf76096328a3badc9f43ea91502313525e842d71e4bb9852ab68f657a190b3b5a5a674af7f9a4cf6b8f947822f807a43a6a7c92200e6f318fe010212dc2d4bd5a98746fb2b5097080c10dcd8a88e0df6eef9f00784fbbb2efe88a481ea7899bdbd3fa73ea6603cfe07ee930f2a6cd16a283bf9adad051778fa9185795e2fa66e202488d50e7bced26a7b896cf7921af0dd6d47a5f434ac8c235e32ed7b9f12edd5dc0e4825e9a68704e08c12d5c982b3c1617824e63e3b567a60788e9e5983737885be37ff6e18d7754dc85a06b55429eb7898b8b2a72f97f204",
+  "sign" : "a71ed8ec74e2bbb6a145a1b9ea26bfa2f4817ca8786527821fb9dd4f3754a597e20dfda716fd01e6014794100ea015d722ea80143d821b9704bd45b75d2b0dc7c06f3912d0e6e057c7d8a36a8aac9751707129ae49ade052265b38f3dd3b05bb344cd53f0d53d985b6006b3b03cad0536835dd6b4299e4952455c317dbd7b310b4d4cd15fd61de8f7b02c6300a8894b938ecd1d8f5b2ba8d89a757793cb57c64dab39e8e035d649ec438d4912ae5959437945cfaaf0b84d636831f3aa2d4b999b38e7acc0bbf938cabc900d31d164dbb7b894af99f6772e101df43c7da129fb08ae3a7fc0864e4e0e9feece6629531c3a349a7a8a678006156e90285aaddcbf0e66a9b81fba62551d9619e01088f9275383531472b57b7983b507561c35e9e8d7857ef6bc67969b3730b6ddb2118b0cf05c28a54caab2c68a76f76c87c21e940fcd0da86fc614a1fed3009979f1754daa58e39106ff3f77adecba33833a984572bc1ba56f152059fd4b1c8be016aa15633ed00a0499d391d7aa0f11fab5ea1cd783d9958f4e8901c5759ca55a38f0cabb961d9af67f2e7fa69bdae2bf1b493175e175c4d72e421375ceb311593010cd0416d1c76c134d8d07c388c9dfd357da7c10fe06790ffd327a11c7a6e99a3826935effb5f9665caacb1b9b627efabaff02881bb094b52c631aea8ce8fe89ec2639d91f4afa71db18a7e249f8ef4198896ac3c830a80cf8c207185bc767f206fbbc65b4e79993412e3389932e97328572ef9d5b6260537eff2564a21d3584c0e0986e9a43509ba5e56c3750cdcf60aa40b164b8d57af376c8aabb95c8581c0fda718e10001000400000047304402207fb73b455365328d090d2cbaef38882dcc22f32ea2a808de58ef4fcfdca960e702200708d0d63017c2be25b37e98ca0e0e4924ba770bd90aeddb429bcda83ed80373010047304402205c5090b406f4399e264f719f691f7587a28b8ccba0aa78e69ab65557eac78c62022065385ced8212a9897e31c31cfc9020c8939421e34cbf3112a837ff2093116c01010047522103d8002c89821382d05c0a80fc016ae0a128a42b5236d3290a33457d2917fa196e2103f1ae08e57685a5d94e7e30bc9df755ca20e13bebc40950619db35a9f0e14e72c52ae",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000002a0028e739352d74ab4246867b2ccba90f4ecf7f5fc798eb4a3bcfe566ec9a2aa0000000000ffffffff4f889d41a40bda8e418101f318cf40138f9ba00e1e05ead034e82c155827167f0000000023220020febc3de1a4abad503a73606204c798d227cfce464deac52f3f0ec499cb5527beffffffff0352c5eb0b000000002200207ff58b3027ae212be9df3dc7b100e3d08e4baffc675143eaf3547f0e3c428de455dcf505000000001600147431d86c20e705688878db011b01cdf8dd5eb547a6dbf505000000001600145956960a9d9d83415276ab59128fe7224ff9bfa800000000",
+    "cets" : [ "02000000000101176ca29310fa7ec9047301b8cf4fa59633d33d8cbde621a6d7102ce4844987ca0000000000feffffff0100c2eb0b00000000160014591f9c3bcc338388f78f9ae34014cdc9f8f02b7d01475221026662373fa09df2bab7a84b91934133abf3607a981b3965da978f63ff302b739621034ac63c6ec36eed37b88e5c254f0c39607737dca047ca4a04ac6404dfb2a65bb352ae64000000", "02000000000101176ca29310fa7ec9047301b8cf4fa59633d33d8cbde621a6d7102ce4844987ca0000000000feffffff02c850c50800000000160014591f9c3bcc338388f78f9ae34014cdc9f8f02b7d3871260300000000160014f498e227c9819c51cc03bb8ef8866f57356a53a401475221026662373fa09df2bab7a84b91934133abf3607a981b3965da978f63ff302b739621034ac63c6ec36eed37b88e5c254f0c39607737dca047ca4a04ac6404dfb2a65bb352ae64000000", "02000000000101176ca29310fa7ec9047301b8cf4fa59633d33d8cbde621a6d7102ce4844987ca0000000000feffffff0100c2eb0b00000000160014f498e227c9819c51cc03bb8ef8866f57356a53a401475221026662373fa09df2bab7a84b91934133abf3607a981b3965da978f63ff302b739621034ac63c6ec36eed37b88e5c254f0c39607737dca047ca4a04ac6404dfb2a65bb352ae64000000" ],
+    "refundTx" : "02000000000101176ca29310fa7ec9047301b8cf4fa59633d33d8cbde621a6d7102ce4844987ca0000000000feffffff0200e1f50500000000160014591f9c3bcc338388f78f9ae34014cdc9f8f02b7d00e1f50500000000160014f498e227c9819c51cc03bb8ef8866f57356a53a401475221026662373fa09df2bab7a84b91934133abf3607a981b3965da978f63ff302b739621034ac63c6ec36eed37b88e5c254f0c39607737dca047ca4a04ac6404dfb2a65bb352aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000102a0028e739352d74ab4246867b2ccba90f4ecf7f5fc798eb4a3bcfe566ec9a2aa0000000000ffffffff4f889d41a40bda8e418101f318cf40138f9ba00e1e05ead034e82c155827167f0000000023220020febc3de1a4abad503a73606204c798d227cfce464deac52f3f0ec499cb5527beffffffff0352c5eb0b000000002200207ff58b3027ae212be9df3dc7b100e3d08e4baffc675143eaf3547f0e3c428de455dcf505000000001600147431d86c20e705688878db011b01cdf8dd5eb547a6dbf505000000001600145956960a9d9d83415276ab59128fe7224ff9bfa8040047304402207fb73b455365328d090d2cbaef38882dcc22f32ea2a808de58ef4fcfdca960e702200708d0d63017c2be25b37e98ca0e0e4924ba770bd90aeddb429bcda83ed803730147304402205c5090b406f4399e264f719f691f7587a28b8ccba0aa78e69ab65557eac78c62022065385ced8212a9897e31c31cfc9020c8939421e34cbf3112a837ff2093116c010147522103d8002c89821382d05c0a80fc016ae0a128a42b5236d3290a33457d2917fa196e2103f1ae08e57685a5d94e7e30bc9df755ca20e13bebc40950619db35a9f0e14e72c52ae0400473044022063439ecc975cce1a22744a9bb9ccf014d056609803d8c4583cea850fe5c535c202203f5d2b812fd9260f6ac7c798dd4a571e2f668ca160374f51777cffef2fdc4b3401473044022069d87d1f7178fd1d0c3788b8b2f29f809948676d3df73e204c2dbb8a9bca42dd022042417bba31656e988395de884c493ccceb2cc9649cbb77ea81651e928b330a06014752210251dd33c8dba756723252077b4d8b68426ac4d06d6cc93d73d64fb5f2807487f72103e8894b31e4c17f05c4b524603ce3a16542df8da878b2ad86086fa6743a4f40a152ae00000000",
+    "cets" : [ "02000000000101176ca29310fa7ec9047301b8cf4fa59633d33d8cbde621a6d7102ce4844987ca0000000000feffffff02c850c50800000000160014591f9c3bcc338388f78f9ae34014cdc9f8f02b7d3871260300000000160014f498e227c9819c51cc03bb8ef8866f57356a53a40400483045022100f830392fa17553c8e874a654334fb25f389cd4f5965a5e46aa5838da0553deee02207f9489c24766ba750a3f384c9a1a7bd25922ab3884a56e4ddac7c97851532c200147304402203f11c1bfe0e64783f30b24d7ad395c34f0278b69bd666b217a668d95c79f4bb1022072eb13d0b903addc4ecaaa2d7df7a18f60359b2f9ba34f09106059a24e2f53e301475221026662373fa09df2bab7a84b91934133abf3607a981b3965da978f63ff302b739621034ac63c6ec36eed37b88e5c254f0c39607737dca047ca4a04ac6404dfb2a65bb352ae64000000", "02000000000101176ca29310fa7ec9047301b8cf4fa59633d33d8cbde621a6d7102ce4844987ca0000000000feffffff02c850c50800000000160014591f9c3bcc338388f78f9ae34014cdc9f8f02b7d3871260300000000160014f498e227c9819c51cc03bb8ef8866f57356a53a40400473044022060f3a456ce6239479fb5e67424c38d974fa44c8f85457a0e09197d4ac865d35c022047e6870be70463214aa09390c4ea9d97dba9908cdddff28c5bda6d141b2a479d01483045022100d31d164dbb7b894af99f6772e101df43c7da129fb08ae3a7fc0864e4e0e9feec0220273a577e0c815a7d7f1d1d0a7f7dd0b0e2b03a9833b249356e37f7c07348ff0801475221026662373fa09df2bab7a84b91934133abf3607a981b3965da978f63ff302b739621034ac63c6ec36eed37b88e5c254f0c39607737dca047ca4a04ac6404dfb2a65bb352ae64000000" ],
+    "refundTx" : "02000000000101176ca29310fa7ec9047301b8cf4fa59633d33d8cbde621a6d7102ce4844987ca0000000000feffffff0200e1f50500000000160014591f9c3bcc338388f78f9ae34014cdc9f8f02b7d00e1f50500000000160014f498e227c9819c51cc03bb8ef8866f57356a53a40400473044022032ed7b9f12edd5dc0e4825e9a68704e08c12d5c982b3c1617824e63e3b567a600220788e9e5983737885be37ff6e18d7754dc85a06b55429eb7898b8b2a72f97f2040147304402206fbbc65b4e79993412e3389932e97328572ef9d5b6260537eff2564a21d3584c02200e0986e9a43509ba5e56c3750cdcf60aa40b164b8d57af376c8aabb95c8581c001475221026662373fa09df2bab7a84b91934133abf3607a981b3965da978f63ff302b739621034ac63c6ec36eed37b88e5c254f0c39607737dca047ca4a04ac6404dfb2a65bb352aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "07fe178edc0f4a4248ffed11d429cfe5bb20f9eb297be3b438ddf900d040229f",
+        "nonce" : "ff4d0fa22bdebeed2d6a150fee1604d2cffdd773f585c4697d72d725f53a9bae"
+      },
+      "contractInfo" : [ {
+        "preImage" : "6712851949035621927",
+        "outcome" : "ef465877c1e37b167fc31c63786ada5347fa16e10095a8139d12e1112daa7247",
+        "localPayout" : 33031917
+      }, {
+        "preImage" : "8446187770364214431",
+        "outcome" : "acc8d1240cd015d17cfe0578f438c29222df66e8563ad7e3b2003ed148d1350d",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-5242003050679690251",
+        "outcome" : "d0cbdc975c1f01c01b262bddb1c8a1db3bb702339ae305d5b2ccbe18d415f1ac",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "acc8d1240cd015d17cfe0578f438c29222df66e8563ad7e3b2003ed148d1350d",
+      "oracleSignature" : "ff4d0fa22bdebeed2d6a150fee1604d2cffdd773f585c4697d72d725f53a9bae918e654d0dde018f8fcc883fa3089961c2bdca2d2af38ee487b7026a7b86e114"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914440d40ec732cba40780f124bf6f5efe4e6675a058700000000",
+        "idx" : 0,
+        "inputKeys" : [ "d945cb49930987a31eb41c1170634d0664ddb1c788567856ae75866ddda5d151", "3157a6b4e9d86557145f827b6f4013910078fa24b10e971f84f2f52aa143671e" ],
+        "redeemScript" : "00201cf1191e03303668a9337594c70d72db6728407c3114dd7dadbd30aa2ec8330c",
+        "scriptWitness" : "0147522103bec8e9dbd34f9ddaa6875de9d965803e3ca5c53dda8220e47700273b7e7327d52103491ca37c6debe14dca2622d41ef46ce3120e9f3da11b4b15b99327d4b87c87a552ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1ql67rcs7jcmhf6qj956jn2auv6dzj977vt40d9k",
+      "fundingPrivKey" : "8de5b3beca7fb6462329b6ecedb8fadbb898e50e721ca5d30780d925bb279e2b",
+      "payoutAddress" : "bcrt1qrzewe6ycka2wg782xjja8cgjqlwm25lveyn7u5"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014263b8d40f2f75f0d427c051536be4d94a609fc2a00000000",
+        "idx" : 0,
+        "inputKeys" : [ "234c4516ad798aefd9ba615b0673f7b0d7d29f0496fb9c1be147fc0ffb7b199f" ],
+        "scriptWitness" : "020021029321b78541351d086730ed06693007e7acabaf4f40ea594ce6adf0b54cf27b79",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q7nfwdglukhxatfkkcq56uj34xnu2cax2uexkmt",
+      "fundingPrivKey" : "005523a95c86d84cd3d206fbf3fa6ee256ac46e0efcf040f2121eea292a6b0b9",
+      "payoutAddress" : "bcrt1q5hr7gahju6vte90dec8nhw59s84k680a2v6vay"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105513363731323835313934393033353632313932370000000001f806ed13383434363138373737303336343231343433310000000000000000142d35323432303033303530363739363930323531000000000bebc200fda7124007fe178edc0f4a4248ffed11d429cfe5bb20f9eb297be3b438ddf900d040229fff4d0fa22bdebeed2d6a150fee1604d2cffdd773f585c4697d72d725f53a9bae0261af0ab4d825867e529cdf72b126c411a0aae11af7020ccf9de137e0ea89bcc30016001418b2ece898b754e478ea34a5d3e11207ddb553ec0000000005f5e1000001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914440d40ec732cba40780f124bf6f5efe4e6675a05870000000000000000ffffffff00da002200201cf1191e03303668a9337594c70d72db6728407c3114dd7dadbd30aa2ec8330c00160014febc3c43d2c6ee9d0245a6a535778cd34522fbcc000000000000000500000064000000c8",
+  "accept" : "a71c6eaeff105c565b339f78dfb8e3226d659cdb66d11212adb9f86a642d91fa2e040000000005f5e10003a1736f63a72fc428967a6cbc47689cc8c0d7a08c69bee073602376996c8030b300160014a5c7e476f2e698bc95edce0f3bba8581eb6d1dfd0001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014263b8d40f2f75f0d427c051536be4d94a609fc2a0000000000000000ffffffff006b000000160014f4d2e6a3fcb5cdd5a6d6c029ae4a3534f8ac74cafda716fd01e600802f53c71f88a90f6cc88a84ad60365f9fa073621fce560f35cff36e3c3d2529db7d05b9461870ba185ac970e93177cd829b9a523252db4a3bbcb621ef4655f60172c5daa8f7af2a1298685d82e5f262c43dc15f7c2e9834369280ff9b0c0f2334c0d1ce74777a1df4b51de68988cc08ee05f1c183ae387b081c3c092a85b1abf4a544652c96b08f951d27641bb32db21715609f056507484c7a7928ac68bd506e00a5dd3b98939dd333e2d659f54371d912a5245bb3e1929a502e35a58f331149c691266bc6ff71d48b9ed1384f1d3243da9833a9b0d5df74d07497e621da18bf9c00dea8f2016bde0a89e1d006a68eb3616673ac19c91072b24657c556dd84ef9c856aa50fbf285619ddff9fb44594b150d15a2683af65b9fe46ad8a2c49f0f44d31032d5ca91f3c6aeca9ebcd434fc27b37ef875c5d04ee41fa472ced9d2c2357b0012e65d22871f0ff70d68d7b613c97be2783e0427fa167f500bdec6b678e161533dfd437f43a243d2054f523368c97a048ca2f560763290e02c774abf07ed5f9bc01e25af41b437bfd8db1a0692310df0a96b23f502dd2f457f8890171b6134349d76db1181654bbf92cc000cf363c0704514c6c728a148d6a6afd492b6c8777effcdf085df3cc96ff0f0ab6e7d7b7c12077dffe45f0fd42d85b51ce473415676bbb10b737b2da6b859a1812c793bc03e8aa0e2da58fd1a5475ab6228dd2a8eed9310ffd6a758627648f6f3be3e69c6921eebab43d4de0ef133220159fe092f1f70e",
+  "sign" : "a71e47115b856d8802805298b1544217bd2564811fb07f4f99e4faa506131820de46fda716fd01e60072632574c88f95a5c8cf41bdcff5c69c6ae49d185521ba048098cc30111e80da002add82f7484bee72b759686f9eb190aaf6d29ae88b7338da80c1c77cac6ef30160bdece7469e904e50aadaf5c812de8b33919eb11c569bd7bcf44b7f18b0aca37d4004d9498089f5f3d5eb0e6c0671031275de402218a84e9f6ae4bc21098ef29a2fa88a4e9e75f88892708a21e0144a43c2f6437355aec82d0e19a8ad0f47f9011e102b432906c8b330e23e3450bf95ea746bca1ca249cbf87ca067f506440b8f36c866d481d19ebdbec7b8f73097945c69ff5d9a025148c925bbdd9c5750973400e2e0d5cbe8c24bc6f59c6959b93750006e3b1d41d92ce9ecf9499731f5a2463c448eadbe7d0dfb9aba550e3ef713eb2c2eb3c79e7dc977067a5780058e862fc2ba0bf2006373f8f000fb9aa6afc27965bda28014b6e32ae8734f7bc3680573b300794e5c4f11fb5cea4f66d01e520df734b493b62f1e511cb09c1dfa4ae5202816fc0e23ad5936a894bc7d04b30f8c3e981908c6f0e4a3623c5cc4a579926358af00e1b4175e0d016b7446d512e929cde4588c8804ccbcd2be1ccd38736a32a15a6597fa1586ed78757af2b2b66c2139b95a55c822bef8d935a242ad8a6989d961cbf2ce961f97dcf55122485775bd01b9de83f125b3855b22d87732a69d405af95e278cff9f802261165f7a3c3f87ee0006163da87b934f2433d9d71d17e1e2bad122e40fb67dc56cee012aff5611b1118ea33235004f62f72b3638619acc56e5c6fda718e10001000400000047304402202d78147ed3cdf36019ed78f88707a97481d57a0206a6837b6a5cb8b7f05cc90a022063a00d928d2a72869d5b8d3286aec0a347f2d833d8ae5276ffd339791d94ca700100473044022075f75d9cc274aac6458a56205bcaed40f9a73f548b4fca58861a5b282fe549c20220373883f8128b9488dbf25d167ccff2812e5d8c384274db97a1a80d70c1edbe10010047522103bec8e9dbd34f9ddaa6875de9d965803e3ca5c53dda8220e47700273b7e7327d52103491ca37c6debe14dca2622d41ef46ce3120e9f3da11b4b15b99327d4b87c87a552ae",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000002e00e2d971bfaa16eb4e7fa754f8d8a13b0d3efd2360f41574c9821b7927da95400000000232200201cf1191e03303668a9337594c70d72db6728407c3114dd7dadbd30aa2ec8330cffffffffe052b444a41c89cd1c99c37660706e6bf946b5e0168fa2495303521848fe84380000000000ffffffff0352c5eb0b00000000220020e777e3111c88875caebee7bfcd3cade9bd80debb27ee859007dc9a365449412da6dbf50500000000160014febc3c43d2c6ee9d0245a6a535778cd34522fbcce1dcf50500000000160014f4d2e6a3fcb5cdd5a6d6c029ae4a3534f8ac74ca00000000",
+    "cets" : [ "0200000000010142f0da893e62cf025d345d6d61795af840d035a1ec6ee0cdb359de3195a4bf290000000000feffffff02ed06f8010000000016001418b2ece898b754e478ea34a5d3e11207ddb553ec13bbf30900000000160014a5c7e476f2e698bc95edce0f3bba8581eb6d1dfd014752210261af0ab4d825867e529cdf72b126c411a0aae11af7020ccf9de137e0ea89bcc32103a1736f63a72fc428967a6cbc47689cc8c0d7a08c69bee073602376996c8030b352ae64000000", "0200000000010142f0da893e62cf025d345d6d61795af840d035a1ec6ee0cdb359de3195a4bf290000000000feffffff0100c2eb0b00000000160014a5c7e476f2e698bc95edce0f3bba8581eb6d1dfd014752210261af0ab4d825867e529cdf72b126c411a0aae11af7020ccf9de137e0ea89bcc32103a1736f63a72fc428967a6cbc47689cc8c0d7a08c69bee073602376996c8030b352ae64000000", "0200000000010142f0da893e62cf025d345d6d61795af840d035a1ec6ee0cdb359de3195a4bf290000000000feffffff0100c2eb0b0000000016001418b2ece898b754e478ea34a5d3e11207ddb553ec014752210261af0ab4d825867e529cdf72b126c411a0aae11af7020ccf9de137e0ea89bcc32103a1736f63a72fc428967a6cbc47689cc8c0d7a08c69bee073602376996c8030b352ae64000000" ],
+    "refundTx" : "0200000000010142f0da893e62cf025d345d6d61795af840d035a1ec6ee0cdb359de3195a4bf290000000000feffffff0200e1f5050000000016001418b2ece898b754e478ea34a5d3e11207ddb553ec00e1f50500000000160014a5c7e476f2e698bc95edce0f3bba8581eb6d1dfd014752210261af0ab4d825867e529cdf72b126c411a0aae11af7020ccf9de137e0ea89bcc32103a1736f63a72fc428967a6cbc47689cc8c0d7a08c69bee073602376996c8030b352aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000102e00e2d971bfaa16eb4e7fa754f8d8a13b0d3efd2360f41574c9821b7927da95400000000232200201cf1191e03303668a9337594c70d72db6728407c3114dd7dadbd30aa2ec8330cffffffffe052b444a41c89cd1c99c37660706e6bf946b5e0168fa2495303521848fe84380000000000ffffffff0352c5eb0b00000000220020e777e3111c88875caebee7bfcd3cade9bd80debb27ee859007dc9a365449412da6dbf50500000000160014febc3c43d2c6ee9d0245a6a535778cd34522fbcce1dcf50500000000160014f4d2e6a3fcb5cdd5a6d6c029ae4a3534f8ac74ca040047304402202d78147ed3cdf36019ed78f88707a97481d57a0206a6837b6a5cb8b7f05cc90a022063a00d928d2a72869d5b8d3286aec0a347f2d833d8ae5276ffd339791d94ca7001473044022075f75d9cc274aac6458a56205bcaed40f9a73f548b4fca58861a5b282fe549c20220373883f8128b9488dbf25d167ccff2812e5d8c384274db97a1a80d70c1edbe100147522103bec8e9dbd34f9ddaa6875de9d965803e3ca5c53dda8220e47700273b7e7327d52103491ca37c6debe14dca2622d41ef46ce3120e9f3da11b4b15b99327d4b87c87a552ae024730440220289e7ba7af264ed5140a675ad5d3ba1a8a6d88abec0c94cfb58e2329f20c17720220393b5fb78baeee7d42eaefc02a09b7df81dc05e86108f0c78c88dcf8b9ad28760121029321b78541351d086730ed06693007e7acabaf4f40ea594ce6adf0b54cf27b7900000000",
+    "cets" : [ "0200000000010142f0da893e62cf025d345d6d61795af840d035a1ec6ee0cdb359de3195a4bf290000000000feffffff0100c2eb0b00000000160014a5c7e476f2e698bc95edce0f3bba8581eb6d1dfd04004730440220559474ff576dbb2e8d241e7d5fbea59b478905716b3c4786ab7cb1b7b8aea842022024c855ee9e9dc1a999ae24852ce3477beb7126774acfd18b4740b3030f94d03601483045022100a5dd3b98939dd333e2d659f54371d912a5245bb3e1929a502e35a58f331149c602207975e8287dda7fbc936dbde3a54ac05e2886c2b0c051f966edd733adaef0a49a014752210261af0ab4d825867e529cdf72b126c411a0aae11af7020ccf9de137e0ea89bcc32103a1736f63a72fc428967a6cbc47689cc8c0d7a08c69bee073602376996c8030b352ae64000000", "0200000000010142f0da893e62cf025d345d6d61795af840d035a1ec6ee0cdb359de3195a4bf290000000000feffffff0100c2eb0b00000000160014a5c7e476f2e698bc95edce0f3bba8581eb6d1dfd040047304402201e102b432906c8b330e23e3450bf95ea746bca1ca249cbf87ca067f506440b8f02201de917073c4d0384bfea8efd0c8527cf3fe8ce27d972bc4372b63c133dbc60ee0147304402203d53599fb964ed04139a00f3948687126829733dcfdd4b1dd54dfea9e62805cf022024b7c0efee73daad3aa24e5897f1532743ff0ff4716e1b222e896ec2e193e732014752210261af0ab4d825867e529cdf72b126c411a0aae11af7020ccf9de137e0ea89bcc32103a1736f63a72fc428967a6cbc47689cc8c0d7a08c69bee073602376996c8030b352ae64000000" ],
+    "refundTx" : "0200000000010142f0da893e62cf025d345d6d61795af840d035a1ec6ee0cdb359de3195a4bf290000000000feffffff0200e1f5050000000016001418b2ece898b754e478ea34a5d3e11207ddb553ec00e1f50500000000160014a5c7e476f2e698bc95edce0f3bba8581eb6d1dfd04004730440220278cff9f802261165f7a3c3f87ee0006163da87b934f2433d9d71d17e1e2bad1022022e40fb67dc56cee012aff5611b1118ea33235004f62f72b3638619acc56e5c601473044022010b737b2da6b859a1812c793bc03e8aa0e2da58fd1a5475ab6228dd2a8eed93102200ffd6a758627648f6f3be3e69c6921eebab43d4de0ef133220159fe092f1f70e014752210261af0ab4d825867e529cdf72b126c411a0aae11af7020ccf9de137e0ea89bcc32103a1736f63a72fc428967a6cbc47689cc8c0d7a08c69bee073602376996c8030b352aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "2f22f5f328ddc2d10447c3fe7ccdfa7dccea5e1fab16e9b4e4102563646cd91b",
+        "nonce" : "a1f641d735ee368d72e7d601b1cc8a1eec2f0f4763eb8ab473df7d33a0ba60a9"
+      },
+      "contractInfo" : [ {
+        "preImage" : "150952825512807850",
+        "outcome" : "1dcadd2045e42b6df0597a7d55ef56f4f9eec4b8f1df0248254e7114dbdec6c1",
+        "localPayout" : 73475257
+      }, {
+        "preImage" : "4252607296472024495",
+        "outcome" : "e1d5747c1341840e564eef469a63f27b4a9920c9f5704934a5eec05faeb39767",
+        "localPayout" : 0
+      }, {
+        "preImage" : "7388997617572666934",
+        "outcome" : "6da041afc45f44be9a4f8c7fff5de850f3b9a6e7a49fa4cf184aa4042c4c4882",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "e1d5747c1341840e564eef469a63f27b4a9920c9f5704934a5eec05faeb39767",
+      "oracleSignature" : "a1f641d735ee368d72e7d601b1cc8a1eec2f0f4763eb8ab473df7d33a0ba60a9c8ee3fd2fcd7c8681142712e12ccae0ba128ff78d785fc51d4f8d4bafcae2b3a"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ea9a05459c0030a10c8cff39552d2cfb4cfb2b228700000000",
+        "idx" : 0,
+        "inputKeys" : [ "ee78ba06a55b063a65792f9da7246b23700ed6f0c6b57d44bda5583f62543769", "cc476392504cc67f93c90f91cbce22a2ac113f625a840403691d9d8dee303843" ],
+        "redeemScript" : "002018ababfaccc36dbd858c45be7e32e67f0a68d3c83f57a5ca4ee513da84d7fd8b",
+        "scriptWitness" : "01475221035898adf5fb2429dcda724787f83252d3113e0406dcde29ad308aaf29ed8f9cc3210288defdabe8a6fc7b02378be99bab50f5fe9c7746a71bc33e72e9466cb61a721252ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qpscdvk65pu4t7lfx0u8y9npg20n3yljrgqujn6",
+      "fundingPrivKey" : "7bb162332e7fb17cbb173d89c8c6f8668e5dadb0530a22355da421faad85e822",
+      "payoutAddress" : "bcrt1qsjg9hsu3zuasadejpcd9e0d7qddg26p2tq4hwz"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020143350ca0b0719ee275cef8a02db4ef364c2bd5ad581110782c9772ad44aad5a00000000",
+        "idx" : 0,
+        "inputKeys" : [ "f68a0d65ea6410b3e80fe880711d76e872a3061dcd310502f0392ef48aa7cc22", "8c388e4ef1c130bafdc7330a6720c727fd76fda88078a56be85e0812533df654" ],
+        "scriptWitness" : "0147522102eecc0d785c54a846c7de98beaae91d680303b1884819210a15ea943bedfcfede2102e76750315f63875335c229f1b94f145306a3af4804145614f9b912c2c1ad45be52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qw4kmc5yq7al8mzyp2zja3uhwswaf89cjxg3509",
+      "fundingPrivKey" : "4cf7a3cb88271754ecd55a9d6f7822b581028e0a7079f28efaffd3724e65c88d",
+      "payoutAddress" : "bcrt1qnw9y3x8my08cu2n4au88parnkvx7h2cjkwxhk6"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710531231353039353238323535313238303738353000000000046124b9133432353236303732393634373230323434393500000000000000001337333838393937363137353732363636393334000000000bebc200fda712402f22f5f328ddc2d10447c3fe7ccdfa7dccea5e1fab16e9b4e4102563646cd91ba1f641d735ee368d72e7d601b1cc8a1eec2f0f4763eb8ab473df7d33a0ba60a902904b8347c992ae1da456c6da9d476133258cd87451e8177974fd515b14e44ded0016001484905bc391173b0eb7320e1a5cbdbe035a85682a0000000005f5e1000001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ea9a05459c0030a10c8cff39552d2cfb4cfb2b22870000000000000000ffffffff00da0022002018ababfaccc36dbd858c45be7e32e67f0a68d3c83f57a5ca4ee513da84d7fd8b001600140c30d65b540f2abf7d267f0e42cc2853e7127e43000000000000000500000064000000c8",
+  "accept" : "a71c3accd26d6a891fafc802c7479b13bb57063d56f5482f79544673317c0bcd2db60000000005f5e10002b2bf8752b8e848a37270f8bbda34d2e124a10fb96f96250a6aedff35f2e0908a001600149b8a4898fb23cf8e2a75ef0e70f473b30debab120001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020143350ca0b0719ee275cef8a02db4ef364c2bd5ad581110782c9772ad44aad5a0000000000000000ffffffff00da000000160014756dbc5080f77e7d888150a5d8f2ee83ba939712fda716fd01e600bcd5324b2925b10d737ae62b7dbce1bdc24d0bd7c35f7c04fbe70a32249165079bbbf0b9a01ccc8979847647b6f9c170685f1397608a3ac1bf328134afad4b9f01178b50a862113b105d93be33d8951c7340cde379e76de83a72064296317bd03ea73f6057bbb86c9fc37f740e751c5d4096ccafc20d8972e6957fd7c120aebe690f710c81ad553829cfd82a34ff1f3df6ff7317bdcd1fbfcb110055d18031460500714031d53d506e7e1be75f338d982ff034bb6af0dd2bcb563da0e4d7990dea5956805289f383354496cee546974b6176c53053b62c2b1a28dc290e583f9ae9a400d2adc761808f5a65775382c1d494b3e7eb21c6a39226059381520074c8e8cebb3cb20c409b73fa0bf1c514edc77c75e8264cfa6c4cc37b8931c2805e0d4381268d4cb4c059ad499c676e4a4c741926df476d663db375098f119ec4a89dceb8c800cf498148d9a8993fa85d1c534d297c67ba27186c5a6dc2a9907ac5a410cd85b2a4b0ca32aa7639cb1d616f18b56207778950b072d824a0ab15edf8af9a4d1c6d01642aba46e5342e9c4741695e5efbacbc15a9966c5d252197a0a5f95b700482c0792c41388e6b254bf6522c0b841f28f36190d50367218669de6a992eee0eaf5487b57c7a232217aea86757926486fa7eb7b14fb180c73cee0608f9b136ca1b9470a8035c2b99afdfb2eb4e648cbfe4758938a6e4bc71257089d40fbf3e3f304c0f840c5960e55a8ea2e52fde1307f140f33abff4a5766a60164cae1ca564dde2",
+  "sign" : "a71e2b640549407e719c025143a212a756e5a23836497403ce9449881d0cfc79190ffda716fd01e601a3f79e9c8f737ab5025d9dcade06f0e1bfbb64882cff658fbf48b7420cd578cc5d0c75b68ed49145990d6df6fae547b1da4ce054be6072afbb0b6703c798d9ff012bc7b5380aa088538313bb955bc3f093b0d0dea7ed134227eda269ac7dec45a88b2ef12a3cb5265ff2bf9a1822fb1be4c2006fc9ed4795fe0c429219f8c3fb07bf8565f3a43546a58be66e632b826eb93d7f05c8219b5707f1fba4651cb2f31e00eed400ceec81067846c06aff68f1575cae69b4a9f8d9907863282ecdcef71bc90d2c44229f665791d73fb216832959e88d7e71f307bf996047ad3bc336dc2291009072e95e2fd88bd08c206556e4e3ca16b7dcf0f075e770c808d624afec97e3198f22cdf75c052225cbbfc2de022a5c3e23887da0d4fbc053067d1444578a43d4c985015aafd89c092e8d61a1f98c018b3abbe9852a96fda77fb3320ea74aedff01758da4a0a334e95858e7bd0a132517948dc30bee2a24d4b78dc5893a810217cd39634a51b88803918e2ded99ddb29720422ee18773a997cb138bd6098facb07e0129cd78a6e27a43693c44457f1cf875123bc41fc0f3db2f420fcc324eab93548df276db52f9919e59db1ee8575ef79c7f80d1a4b2ca1bbbce361b629c76855ba02cadfb0b4b197d3960f1067c4f739be9f3df1c2c62640027afc9f50bebab646e2ca56a8fe7ef1d4d74d8b84d6e485e6b68fa324a4d37d1622c7bee97b0fd60551bbbf85f31ed3b00fd7474fa19fab533ebd38a904b1a6a08b3ffc672b6bc1a7bfda718e100010004000000473044022035580e5594a203f70ef98cbe948bda772e48518a37ccd0421718186a0fbb6348022011a3f8117c7a7a84b27431650b62ae32605eb9fb0242075b8a403af4cb050227010047304402205f5b4739d5d2fb5b0bc2f9713034167e91d48a7dfc046569f81dcb490bfcffb002203adf48922c4eb57fafef13a8e7b3ea9fc4aa633457baff54daffd1e7a16dba990100475221035898adf5fb2429dcda724787f83252d3113e0406dcde29ad308aaf29ed8f9cc3210288defdabe8a6fc7b02378be99bab50f5fe9c7746a71bc33e72e9466cb61a721252ae",
+  "unsignedTxs" : {
+    "fundingTx" : "02000000025dc80d1061d448b76b03f02cf6e4e916d64ed15df65c71d0a7228f72e7e64e3a000000002322002018ababfaccc36dbd858c45be7e32e67f0a68d3c83f57a5ca4ee513da84d7fd8bffffffffeb5cc4f8d4258c057147d08a31b3ec4dbb7783393ed93c9d74e9e8454a0fc35e0000000000ffffffff0352c5eb0b000000002200208a826fd3ff4c08a6fbc539a32b4504bfe5f1c76f04da1b22ebedde292f78c575a6dbf505000000001600140c30d65b540f2abf7d267f0e42cc2853e7127e4355dcf50500000000160014756dbc5080f77e7d888150a5d8f2ee83ba93971200000000",
+    "cets" : [ "02000000000101b934b4f7702cfb0fc0b72c3cbc6005a4b2edb489e58453ca336ef72a24d7a8110000000000feffffff02b92461040000000016001484905bc391173b0eb7320e1a5cbdbe035a85682a479d8a07000000001600149b8a4898fb23cf8e2a75ef0e70f473b30debab120147522102904b8347c992ae1da456c6da9d476133258cd87451e8177974fd515b14e44ded2102b2bf8752b8e848a37270f8bbda34d2e124a10fb96f96250a6aedff35f2e0908a52ae64000000", "02000000000101b934b4f7702cfb0fc0b72c3cbc6005a4b2edb489e58453ca336ef72a24d7a8110000000000feffffff0100c2eb0b000000001600149b8a4898fb23cf8e2a75ef0e70f473b30debab120147522102904b8347c992ae1da456c6da9d476133258cd87451e8177974fd515b14e44ded2102b2bf8752b8e848a37270f8bbda34d2e124a10fb96f96250a6aedff35f2e0908a52ae64000000", "02000000000101b934b4f7702cfb0fc0b72c3cbc6005a4b2edb489e58453ca336ef72a24d7a8110000000000feffffff0100c2eb0b0000000016001484905bc391173b0eb7320e1a5cbdbe035a85682a0147522102904b8347c992ae1da456c6da9d476133258cd87451e8177974fd515b14e44ded2102b2bf8752b8e848a37270f8bbda34d2e124a10fb96f96250a6aedff35f2e0908a52ae64000000" ],
+    "refundTx" : "02000000000101b934b4f7702cfb0fc0b72c3cbc6005a4b2edb489e58453ca336ef72a24d7a8110000000000feffffff0200e1f5050000000016001484905bc391173b0eb7320e1a5cbdbe035a85682a00e1f505000000001600149b8a4898fb23cf8e2a75ef0e70f473b30debab120147522102904b8347c992ae1da456c6da9d476133258cd87451e8177974fd515b14e44ded2102b2bf8752b8e848a37270f8bbda34d2e124a10fb96f96250a6aedff35f2e0908a52aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "020000000001025dc80d1061d448b76b03f02cf6e4e916d64ed15df65c71d0a7228f72e7e64e3a000000002322002018ababfaccc36dbd858c45be7e32e67f0a68d3c83f57a5ca4ee513da84d7fd8bffffffffeb5cc4f8d4258c057147d08a31b3ec4dbb7783393ed93c9d74e9e8454a0fc35e0000000000ffffffff0352c5eb0b000000002200208a826fd3ff4c08a6fbc539a32b4504bfe5f1c76f04da1b22ebedde292f78c575a6dbf505000000001600140c30d65b540f2abf7d267f0e42cc2853e7127e4355dcf50500000000160014756dbc5080f77e7d888150a5d8f2ee83ba9397120400473044022035580e5594a203f70ef98cbe948bda772e48518a37ccd0421718186a0fbb6348022011a3f8117c7a7a84b27431650b62ae32605eb9fb0242075b8a403af4cb0502270147304402205f5b4739d5d2fb5b0bc2f9713034167e91d48a7dfc046569f81dcb490bfcffb002203adf48922c4eb57fafef13a8e7b3ea9fc4aa633457baff54daffd1e7a16dba9901475221035898adf5fb2429dcda724787f83252d3113e0406dcde29ad308aaf29ed8f9cc3210288defdabe8a6fc7b02378be99bab50f5fe9c7746a71bc33e72e9466cb61a721252ae040047304402205e49242a7c5d215f44b3f02909414cedc650263c8a64facbcbdfdeda3aa9988a0220079aa0a254cfdc385a743e239dbc9115a32154cca91f05ce9625f180ed17523a0147304402202bbb2170d065094793cdd8b0388ac0edd96a3333dda2d912ae62f5ee5f01242302200e214c5c299dbb9347eb7959ea603bbc8c7a01bd4d69dab135bb5633a70fcdb20147522102eecc0d785c54a846c7de98beaae91d680303b1884819210a15ea943bedfcfede2102e76750315f63875335c229f1b94f145306a3af4804145614f9b912c2c1ad45be52ae00000000",
+    "cets" : [ "02000000000101b934b4f7702cfb0fc0b72c3cbc6005a4b2edb489e58453ca336ef72a24d7a8110000000000feffffff0100c2eb0b000000001600149b8a4898fb23cf8e2a75ef0e70f473b30debab120400473044022020ae427350b88af5d1fb22072253dd94a1d9fccf859fedfca9422e38d86a49ee022063ea5848226c44385315cb99ad2596df5944e54f4486f520afdd079e1d258ce1014730440220714031d53d506e7e1be75f338d982ff034bb6af0dd2bcb563da0e4d7990dea5902201961183b595e11f514443a93ec33d3b122c04490dbeeb84769bd0a576b7a3ae00147522102904b8347c992ae1da456c6da9d476133258cd87451e8177974fd515b14e44ded2102b2bf8752b8e848a37270f8bbda34d2e124a10fb96f96250a6aedff35f2e0908a52ae64000000", "02000000000101b934b4f7702cfb0fc0b72c3cbc6005a4b2edb489e58453ca336ef72a24d7a8110000000000feffffff0100c2eb0b000000001600149b8a4898fb23cf8e2a75ef0e70f473b30debab120400483045022100eed400ceec81067846c06aff68f1575cae69b4a9f8d9907863282ecdcef71bc902202c9dd2fcea03b63716e2c555c310266078493fbe54f437ff5b9fdc51f9e77df9014730440220011ab142852f3c26f7e3a8d1e81dd1df67cb5cc3a62f0d4a7ae3491dceb490bd022019b820915c1aa574b82078e98e81bae386633c468b78ae369c1e1d5a97a0c3310147522102904b8347c992ae1da456c6da9d476133258cd87451e8177974fd515b14e44ded2102b2bf8752b8e848a37270f8bbda34d2e124a10fb96f96250a6aedff35f2e0908a52ae64000000" ],
+    "refundTx" : "02000000000101b934b4f7702cfb0fc0b72c3cbc6005a4b2edb489e58453ca336ef72a24d7a8110000000000feffffff0200e1f5050000000016001484905bc391173b0eb7320e1a5cbdbe035a85682a00e1f505000000001600149b8a4898fb23cf8e2a75ef0e70f473b30debab12040047304402202ca56a8fe7ef1d4d74d8b84d6e485e6b68fa324a4d37d1622c7bee97b0fd605502201bbbf85f31ed3b00fd7474fa19fab533ebd38a904b1a6a08b3ffc672b6bc1a7b01473044022070a8035c2b99afdfb2eb4e648cbfe4758938a6e4bc71257089d40fbf3e3f304c02200f840c5960e55a8ea2e52fde1307f140f33abff4a5766a60164cae1ca564dde20147522102904b8347c992ae1da456c6da9d476133258cd87451e8177974fd515b14e44ded2102b2bf8752b8e848a37270f8bbda34d2e124a10fb96f96250a6aedff35f2e0908a52aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "d0e25e8b526490891c02384ecb08c69fafa42a57c8bf8b3a9906e67cc19d5ac1",
+        "nonce" : "23d71b8d2a09dc4428642ac71ab59b8f02652f2777105048aecf736e1e52b53c"
+      },
+      "contractInfo" : [ {
+        "preImage" : "6517031403715587696",
+        "outcome" : "c6681dec1db3284037587129da329022d1a7bac0037daadc6ab74280b1fb19fd",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "8838865059568478908",
+        "outcome" : "c025e5d5d3fc33431b92f3d08d4d5cc7f4d4e5bb55df8d1aeb519c210fd3a018",
+        "localPayout" : 45243117
+      }, {
+        "preImage" : "3113556259836805282",
+        "outcome" : "50f66e732773347747841711db0e5b93f7a28c9edbe66a98f01906a66e6d0a00",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "c025e5d5d3fc33431b92f3d08d4d5cc7f4d4e5bb55df8d1aeb519c210fd3a018",
+      "oracleSignature" : "23d71b8d2a09dc4428642ac71ab59b8f02652f2777105048aecf736e1e52b53c3bd57c5b34b0eeb86f35e99ced17433534db2f8625119f87d7ff260a13f7fc57"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91491a3aad0337e25f053b4abe1208df6ca83f328fe8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "b9e19d454b47c2c752ed009e66616a447650d3a2cfc0215380c6099df8271082", "4fe132f30f33bcc8c94cddba265a73b8e2a74f30ab5fb190381cde6d721f9e78" ],
+        "redeemScript" : "00206b51a48685c66bd074f68f0e6f37638fc5bb111d2fd309f802b9bab9b6f025cf",
+        "scriptWitness" : "0147522102d77e0a67636f1f01d21ad6d2e6dff1f592808ff418cafc650fd22d672d8d94852103caac050bdc379a2c70f4e645114ea621345a69bf8390826c102d9a4190e3cdd352ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q6p828avz64gpcplcpye3xgdm2uqjtdy65hfkql",
+      "fundingPrivKey" : "be26dd44c09e04ad8a3a6d28e02c65c46a8296335d3f91cc9ca663d71e40a3eb",
+      "payoutAddress" : "bcrt1qk7ze282ttg6f5nh43xfu0s40gm5c60rq0v7k6t"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9149ec006a7053de88fee4ae1a118b8e45bc393a1588700000000",
+        "idx" : 0,
+        "inputKeys" : [ "4af68316d07cc4359c69c3226bd1b59b15ce18e4d7d0b4d0884d224912a3564c", "f3271fc563f4b07b2777e9567ee44233855b40dd3b438dc322d180a506a02136" ],
+        "redeemScript" : "002039cbba7a01ac85d1f49828606e7cd75b4a943af9877dc362b25fc07024c56138",
+        "scriptWitness" : "01475221034d3baa2f1a3f1ac6d8c2e0ae68ab19bff9a68855cbec087500a94456fb03aaef210360a21e7e286d837ba0ea877c69c0efb5e9c18ced9b9990c183a25dbcdcf6427e52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qt6m8z38z59h7j22eeczym79m3knmmtkc08c83h",
+      "fundingPrivKey" : "8f83f7611c657c7a76eb11d97e5c58051394f40804b76a8091f30cb191ef391a",
+      "payoutAddress" : "bcrt1q0gqewsl6snzc9gsr34njx6rum48g5j7fwpsey4"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710541336353137303331343033373135353837363936000000000bebc20013383833383836353035393536383437383930380000000002b25aed13333131333535363235393833363830353238320000000000000000fda71240d0e25e8b526490891c02384ecb08c69fafa42a57c8bf8b3a9906e67cc19d5ac123d71b8d2a09dc4428642ac71ab59b8f02652f2777105048aecf736e1e52b53c03e72a087657a0648752452ef492675ab9f0fce074eb0ed6d00e06f8fb5fbf14b400160014b785951d4b5a349a4ef58993c7c2af46e98d3c600000000005f5e1000001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91491a3aad0337e25f053b4abe1208df6ca83f328fe870000000000000000ffffffff00da002200206b51a48685c66bd074f68f0e6f37638fc5bb111d2fd309f802b9bab9b6f025cf00160014d04ea3f582d5501c07f809331321bb570125b49a000000000000000500000064000000c8",
+  "accept" : "a71ccb0632195088f6c07aa499b06f0504edc31a4025d4eca629124626422e601c710000000005f5e100023f644a45fe1cbfbab6a9ae4c717126dbe88665b83f17f312b491d1323e1f1195001600147a019743fa84c582a2038d6723687cdd4e8a4bc90001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9149ec006a7053de88fee4ae1a118b8e45bc393a158870000000000000000ffffffff00da0022002039cbba7a01ac85d1f49828606e7cd75b4a943af9877dc362b25fc07024c56138001600145eb67144e2a16fe92959ce044df8bb8da7bdaed8fda716fd01e60087ef4cf4d99c5bd119a798829ebed44bf9b73d1a1dde783afd1016a3873a2a7d361ce739a6034f56a92904b2ce868627877fe0ce52ab1064723827f980e6ad5100cae16016f7c9fed824cd86248b7067dfe30124ef46d7c91b70bfe83867ceb9dd95c63d5ca7cb731bb6087aadd1a072ea878865007dd7ea38f388093ab857f16e9e682deac295e4251d603754c59daa129a6a56f3228958ddd6df3919af1989d8012c04c87a050067e1acd278cf3d610b955e61dac5a0dc0ba52472ea8bfb7ab58d8caa2aec87e647a5b29877154f4f891c889ad81796730d4e8701db6317ffb3ab0144125d559a895c29c99cebb8db905b1ed21aaae10c50fbc2e598e753915a0eb6a44b3d5b4096f7b3bf86c3346ddcb0089a9d5ad4fe7037639d635ee7196a19b83a5883311e3662f1eae9d84c5308a7000f1f482f26b09694889207d382cad16801ee731665c108f571a565e13732227711b48debde24d73c8566ff55141a3ab6060158b0b29a125206977f91567547fcf54087f83cdc92f99c61b9c97635b9507a019096871bc655e7f25d5e79ce76ca4f4bd948cf08718e833d15beaff4e1bb6ef39fc585f5ae6ed846c3350827011e0cf7f076b17f38ddf5311a73482de84beb583ca59bb1e14b330351fa321ed86a288262e8b18b7ad08f46e68fa409911d08a417d829219b50e9a442b34cb24ab9455457e7e5d807193624bccf7c0c331a551d1695195767e62838b04b583ed251307512ef5a6ab4602dd03ceec6c0d6f8d62d",
+  "sign" : "a71ed4e7ac78afbd412b531c3fab64846a6f4e2c5651a6b2324a072c97f725980d26fda716fd01e60090ee3de03e6020f0670722f8aece53aa489c2b5faecabaafc742c8a9fdf0199d7b358265d495b4cb6369c1ed7eb75b6ccc84e7e356dbde7a593a2b15d6518a320014b38e35671ebe8041d81fab274d4c8ac5494740475b85c6a0305d79a690345579156dc6cc5b5af743147e1a5d58ca24a882863563d93f9735f73899e35451e28f7623f43de28275656c9e472ff991590a0ab4e7613c5cd35912fcd321da89920144c360343982693563ece5f63a935247dffdc52ecb4b69050b65bf24f404221546bd550077456a25c7a22926df59bfc181669e01675004a4bf569ba54b0ea75b0069ef46d6ce1129504396e3dd33295085df82993ecb31fc4ea0e2b9e5c5f9eec8fa6b42452a728402ea58a382c3757870c6660a46a098967a6d6f6038b75634af689256a67416f8dd350586cf2581b656aa24e8bef5b8fb25154715b4a8ad05f600b8ca8056dfdc96f99f491d6fa3cc3b6fb110627af7609b83fe4ebad29209a8d1ab6d760a588a33d0a5263c48f3891ece1a99ed991bb2283bfc3ba6b68610b5fb01be20cb9ec512ecb6c4571af83ebe0073cdbcc0413641908bd7f53a6b01cc0dc3392a5462c8a7fd4e7735503ee5e57c5d9507cf91994ecca6b6b4f678ad567b9f92f895f5f0dc802920677ee27dd207307db893f18914b3896e63367dc6d703f73a0eb7a225e48218aab61fe6998a12300b54b6eb87f491e0d7016ca42e3c96e44c444c14def618802197144fa972f775e081b9f85b1273e6cc7e61bba3ce9e9afda718e1000100040000004730440220576a909bab380bf929d482604ee31b695430ff8481a96d67d2b66c38f937fe82022036fb0a0b30d5c09b0f8415a031643517e4db5656f1422fb3cc05d678f5a804ed010047304402203cc07c58257b07820918c4d5fe750eb2fd049ec3ac7283a8f32426d6ea1e50b902205b0e15ffa85907e69431594881a45aa931549a87fe4e64aa2bbe2639660c511d010047522102d77e0a67636f1f01d21ad6d2e6dff1f592808ff418cafc650fd22d672d8d94852103caac050bdc379a2c70f4e645114ea621345a69bf8390826c102d9a4190e3cdd352ae",
+  "unsignedTxs" : {
+    "fundingTx" : "02000000026e269adc93eb769028c20720e889779e535dd95cdba63f7c89b4b2c3c79a2f5800000000232200206b51a48685c66bd074f68f0e6f37638fc5bb111d2fd309f802b9bab9b6f025cfffffffffb2a4db135e736c05dab86570c3c99f7c4f9c233c47b3c006d541206d9721a14f000000002322002039cbba7a01ac85d1f49828606e7cd75b4a943af9877dc362b25fc07024c56138ffffffff0352c5eb0b0000000022002049eaea011abb1ea5d1ff721c44c205b5b4ae2ac51b853837254f9be4eaff8536a6dbf50500000000160014d04ea3f582d5501c07f809331321bb570125b49aa6dbf505000000001600145eb67144e2a16fe92959ce044df8bb8da7bdaed800000000",
+    "cets" : [ "020000000001015711f80bb5b16a1563945e727416368d826e810b1ba6b829ebb735ff619ee11f0000000000feffffff0100c2eb0b00000000160014b785951d4b5a349a4ef58993c7c2af46e98d3c6001475221023f644a45fe1cbfbab6a9ae4c717126dbe88665b83f17f312b491d1323e1f11952103e72a087657a0648752452ef492675ab9f0fce074eb0ed6d00e06f8fb5fbf14b452ae64000000", "020000000001015711f80bb5b16a1563945e727416368d826e810b1ba6b829ebb735ff619ee11f0000000000feffffff02ed5ab20200000000160014b785951d4b5a349a4ef58993c7c2af46e98d3c6013673909000000001600147a019743fa84c582a2038d6723687cdd4e8a4bc901475221023f644a45fe1cbfbab6a9ae4c717126dbe88665b83f17f312b491d1323e1f11952103e72a087657a0648752452ef492675ab9f0fce074eb0ed6d00e06f8fb5fbf14b452ae64000000", "020000000001015711f80bb5b16a1563945e727416368d826e810b1ba6b829ebb735ff619ee11f0000000000feffffff0100c2eb0b000000001600147a019743fa84c582a2038d6723687cdd4e8a4bc901475221023f644a45fe1cbfbab6a9ae4c717126dbe88665b83f17f312b491d1323e1f11952103e72a087657a0648752452ef492675ab9f0fce074eb0ed6d00e06f8fb5fbf14b452ae64000000" ],
+    "refundTx" : "020000000001015711f80bb5b16a1563945e727416368d826e810b1ba6b829ebb735ff619ee11f0000000000feffffff0200e1f50500000000160014b785951d4b5a349a4ef58993c7c2af46e98d3c6000e1f505000000001600147a019743fa84c582a2038d6723687cdd4e8a4bc901475221023f644a45fe1cbfbab6a9ae4c717126dbe88665b83f17f312b491d1323e1f11952103e72a087657a0648752452ef492675ab9f0fce074eb0ed6d00e06f8fb5fbf14b452aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "020000000001026e269adc93eb769028c20720e889779e535dd95cdba63f7c89b4b2c3c79a2f5800000000232200206b51a48685c66bd074f68f0e6f37638fc5bb111d2fd309f802b9bab9b6f025cfffffffffb2a4db135e736c05dab86570c3c99f7c4f9c233c47b3c006d541206d9721a14f000000002322002039cbba7a01ac85d1f49828606e7cd75b4a943af9877dc362b25fc07024c56138ffffffff0352c5eb0b0000000022002049eaea011abb1ea5d1ff721c44c205b5b4ae2ac51b853837254f9be4eaff8536a6dbf50500000000160014d04ea3f582d5501c07f809331321bb570125b49aa6dbf505000000001600145eb67144e2a16fe92959ce044df8bb8da7bdaed804004730440220576a909bab380bf929d482604ee31b695430ff8481a96d67d2b66c38f937fe82022036fb0a0b30d5c09b0f8415a031643517e4db5656f1422fb3cc05d678f5a804ed0147304402203cc07c58257b07820918c4d5fe750eb2fd049ec3ac7283a8f32426d6ea1e50b902205b0e15ffa85907e69431594881a45aa931549a87fe4e64aa2bbe2639660c511d0147522102d77e0a67636f1f01d21ad6d2e6dff1f592808ff418cafc650fd22d672d8d94852103caac050bdc379a2c70f4e645114ea621345a69bf8390826c102d9a4190e3cdd352ae0400473044022076d3068562e25608b284c7fe8d87483251b7cdfc96742ef988e09840b07f18fd02207292a8fb6875bcac1c37845e3cea52d9c57f1883750012cdb797e2cdd90d9c5e01473044022078736dcacdd98deb9c8f6ff9023a22b529b8df42f34d8f479d3f36b5f920c40a022011c38ef6a1ee47832b7ad85cfa4b89429e609b2121ff843efca90845020f83ce01475221034d3baa2f1a3f1ac6d8c2e0ae68ab19bff9a68855cbec087500a94456fb03aaef210360a21e7e286d837ba0ea877c69c0efb5e9c18ced9b9990c183a25dbcdcf6427e52ae00000000",
+    "cets" : [ "020000000001015711f80bb5b16a1563945e727416368d826e810b1ba6b829ebb735ff619ee11f0000000000feffffff02ed5ab20200000000160014b785951d4b5a349a4ef58993c7c2af46e98d3c6013673909000000001600147a019743fa84c582a2038d6723687cdd4e8a4bc9040047304402202c04c87a050067e1acd278cf3d610b955e61dac5a0dc0ba52472ea8bfb7ab58d02204f76832302b53af211027c0f6c255ed1c34b95492b0599960fd440deafbb5e1b0147304402206abd36aefee6557b0e906a8390ab8e410840ab01c4731cb25448b63ea5bc1da60220230e8721892bf68c4e645d9c5a2498b14f3f146302e46a63451e426835ba77e101475221023f644a45fe1cbfbab6a9ae4c717126dbe88665b83f17f312b491d1323e1f11952103e72a087657a0648752452ef492675ab9f0fce074eb0ed6d00e06f8fb5fbf14b452ae64000000", "020000000001015711f80bb5b16a1563945e727416368d826e810b1ba6b829ebb735ff619ee11f0000000000feffffff02ed5ab20200000000160014b785951d4b5a349a4ef58993c7c2af46e98d3c6013673909000000001600147a019743fa84c582a2038d6723687cdd4e8a4bc90400473044022069359e7e16ee11515e66e0c565defbbce9b4226e18b48af14307167665e4d190022023d344c7ce31bcb115d38f8b5565e00e599ccc3dae5ba6add098a08bbfecbdda01473044022044c360343982693563ece5f63a935247dffdc52ecb4b69050b65bf24f404221502201fa64b35238bbf3ca2196f10728b4707742a90e0e70ae4947f91c608ae61a1e101475221023f644a45fe1cbfbab6a9ae4c717126dbe88665b83f17f312b491d1323e1f11952103e72a087657a0648752452ef492675ab9f0fce074eb0ed6d00e06f8fb5fbf14b452ae64000000" ],
+    "refundTx" : "020000000001015711f80bb5b16a1563945e727416368d826e810b1ba6b829ebb735ff619ee11f0000000000feffffff0200e1f50500000000160014b785951d4b5a349a4ef58993c7c2af46e98d3c6000e1f505000000001600147a019743fa84c582a2038d6723687cdd4e8a4bc90400473044022017d829219b50e9a442b34cb24ab9455457e7e5d807193624bccf7c0c331a551d02201695195767e62838b04b583ed251307512ef5a6ab4602dd03ceec6c0d6f8d62d0147304402203a0eb7a225e48218aab61fe6998a12300b54b6eb87f491e0d7016ca42e3c96e402204c444c14def618802197144fa972f775e081b9f85b1273e6cc7e61bba3ce9e9a01475221023f644a45fe1cbfbab6a9ae4c717126dbe88665b83f17f312b491d1323e1f11952103e72a087657a0648752452ef492675ab9f0fce074eb0ed6d00e06f8fb5fbf14b452aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "43468143b71c36008af3c3c01dc8e5eef96d2bcb6ea4601d64fa90e73fa44258",
+        "nonce" : "696bdbd1680d3cc0e475d04e818461ffbd17a20373c7993c8a284a06ed93a46c"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-8011856795177986623",
+        "outcome" : "5804007be8b560ebf2d8338f9a5723b98562c78d070c3c9f10afb10359d73f08",
+        "localPayout" : 0
+      }, {
+        "preImage" : "8869019047350728983",
+        "outcome" : "484781a793895ba606bcbd6d6b66efc33f1fae2b62021c4e401cf1d087a2cc4a",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "1490555708687558068",
+        "outcome" : "6356be50d6a3c57e0ffa6fb9c28c95ac133ed7e60149a8e6e5d3825d41dc77dd",
+        "localPayout" : 24982428
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "484781a793895ba606bcbd6d6b66efc33f1fae2b62021c4e401cf1d087a2cc4a",
+      "oracleSignature" : "696bdbd1680d3cc0e475d04e818461ffbd17a20373c7993c8a284a06ed93a46c0204aef86c3dd8a0054183d6c70fc758db5e09af94d5f3a2531586e59266deab"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002003235db1ca6ffe1bb2f93801809b4b23d7ffb82ac3a63dbf192dbf82d9b117e400000000",
+        "idx" : 0,
+        "inputKeys" : [ "e9aa78abc77e7aac33f8552b8254068a2d3520d65ceb76ec70522babc5206ba3", "f042550d7012cf66e825ab69826afa02db78bc995484f763795771cd918659d7" ],
+        "scriptWitness" : "0147522102fb96863291d1a18d26cfe76269bae866563944c475a20b3d7ae84e2dc8638c7321033ffc8e31d5cef0c707970912826c2ef899a2bf1d8fde3eb5a656b66021011d8252ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qcqvn9ny62qurcrxwmn4jldeqpa3ryc7hz5wsh5",
+      "fundingPrivKey" : "afb30e7e0ccef7b57f2c729215e1a905ec2b38263bf1d757e4cc84565a403ca9",
+      "payoutAddress" : "bcrt1q29sg550gyk4q77ha7m5ct0uxs6njnskqjhw9k0"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200206070a0b6d470d6f7287d4d2b79a47d17e8070a64bc13da971bbee6570d99816600000000",
+        "idx" : 0,
+        "inputKeys" : [ "db1315bd3b7d529d7f40cbfbef2741ff5660a30d948f01e2d8d244dda4dcf624", "9d34b7a274f2c9d3ddc26db8056f20dd769ed341491551154538254b2c61c1d5" ],
+        "scriptWitness" : "014752210307de96b6171e972780bd3345b06a3bec5aea7509665f66709237b42f7db74b3821025bed925b3f93a5a9d2e23cdabcc48dfb480c041594a115d94a245efbdc5e1a7c52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e4f81461bdc9179a3be7953231d51cd46ef1650800000000",
+        "idx" : 0,
+        "inputKeys" : [ "0be99e9a889fafa64db686f49a67f7644246ae1486aa99f67930e02f8fa9a7d4" ],
+        "scriptWitness" : "02002102fdd94169de0814f523198621833110b7af158d60939929444fce40f99d1fd327",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qlgq2pqz3rwnd2u3kr6tjwmg33c6wpk2xs02h0u",
+      "fundingPrivKey" : "8ca85a75856e59e58630ceced38e02a2647cd3ba2d0bb882abcb2ef577398c6a",
+      "payoutAddress" : "bcrt1q9j4gtvjswf23xup3kcudsxa5uc8vtj95zqcc8s"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71055142d3830313138353637393531373739383636323300000000000000001338383639303139303437333530373238393833000000000bebc200133134393035353537303836383735353830363800000000017d339cfda7124043468143b71c36008af3c3c01dc8e5eef96d2bcb6ea4601d64fa90e73fa44258696bdbd1680d3cc0e475d04e818461ffbd17a20373c7993c8a284a06ed93a46c02586b2e25be4de8e375b8da35b675dcd96e6b4449b5b32d89ee833d65a2c0f9680016001451608a51e825aa0f7afdf6e985bf8686a729c2c00000000005f5e1000001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002003235db1ca6ffe1bb2f93801809b4b23d7ffb82ac3a63dbf192dbf82d9b117e40000000000000000ffffffff00da000000160014c01932cc9a50383c0ccedceb2fb7200f623263d7000000000000000500000064000000c8",
+  "accept" : "a71cf79888ea555202102f69a7b7dcc4c66f4563c5f6bf98a9fc3e07b7153d0aa2400000000005f5e1000259d9a49f56d95a58ca29be5b4c6d6c191c93e4c8e7e04ad5c5d09fe9819abf50001600142caa85b2507255137031b638d81bb4e60ec5c8b40002fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200206070a0b6d470d6f7287d4d2b79a47d17e8070a64bc13da971bbee6570d9981660000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e4f81461bdc9179a3be7953231d51cd46ef165080000000000000000ffffffff006b000000160014fa00a080511ba6d572361e97276d118e34e0d946fda716fd01e6014721cd9d2cdc080c7f8b8213f2a6aa2a4e496a899f447c13cdd5aeb226dc4f6e61b140dbfb098d648a6140fefef25b11fbd94b643795cbadc65bcb22fc901e120177e4cc7324fb091347330bffd773b8680441a97cb450fbc51adf7c0966c9d73c6f879a24d531909bcf463208a135bbd3a08949b50380ebf3a9c04b4af20347ab6c646185513dd0f882c2509fec7cca326644e0a3f204b34e28d4d7d2cd734bb100a188900c6aab915e1a490543ce61e3007cfcb4161e965dae9e4c7c21deff54c2084f0d42077d72e034d4b859b6f64db8291671a97fd3737b90c14a98947608dc01702b2ba2a0c8345f67f383ba69702609bd2a3a0ef0103a61cbb8c0722e06aa0c449a9cc7933250e501e105ad4c03bbe3f05a41b2c2c604d184ad00a42bf84753d36d940072692a51d684331d4d245142c78565fdcaa2754e80dab989f683ec890066cf8a7c13ff705d9cf121864c1b313c386f7f58c1cb4d722b6baba90906a140af7a4f07034c7011d665306e154554b686d4a92fbf9bda94548cac9c54d5fa8601ae07866458f066b8373e633d3566fcae30d59aefd0e20e2232163f8b442dcdb204eaedce99ef0da6656734cb450f8d31b3815ebd97faccfacaa07c5c5245988b0a0d5599e0c51306b4134395b705439441e5b1a30e22e50c7a564f3c9246596a7f60b9ef4a2363284afb3f4dd34ac08846e5a2ced08da79bc2782c013b1000a5067856fbdde3c2ce1a3b98fce856919204ae700e159312eb8a1041cb50822146",
+  "sign" : "a71ed84125d1880dcadf77eda21ec815300a3d0274d6d96e7bd65c9eae5021e71c78fda716fd01e601c1ba82f4398581efa86fd287e9942f85d24f065a13b8efba35328452054658e1a0abe1c19372a731899fa30a0688e74789900b0d519b2c6c7690094ea8c326e6002b0ba3f6a726d07a4c7717d6bd636c8ec0e70ba83faefe32e13f0734f7d79379c930e04c061c390b5e57756ed5a303cd26e2fdaadfaa98eaa4f07ca42767ed04735d631a264beb07438be0e428b5f4a991a3ea48c582cd15676ba0ebfb3c5ded0053b296ee9ab2cbd810a18b6667c0a7895545a3564294f95afb1c3f740fb1678458ceba27883ec9b79b8b2f63db8187eb6fd3f928c1b96d5bcd6be19e0ecec59c00b7aa2af5ba2eb499263fe9082af5d1eb9eb37e7b36c18033fb3e48585119517b37551851d3990819617304f33c6a0785cbfe4484ef2ed92b51c6b77e7f790bd5539ac351caf137f23e7b81ea4b34aae18e3c7a945e4220570c1d15dd3b5056a700925901e2f5b3d58437a0b5dc33f7708260bf30c2d9dca1d2bbee99c3cab3739f761240a26b45a6aa654eb47168ac2b579e6b06f819c874845796242323e8e7ba01148205128121e354ec4c1a0ce3f5d574fe2b90e7b4b91156d30947a65077a49bc8c47f2ed42ca16fed5e6c780cb64dc8ee12deaa264394486910ea3a8358bb2c04b6cef868e7227528edcf4a5179848ff06244e0c0ee9753f258dab23a5dbc5a7828fc6972c3d8282126e9bc8ac738658fca1a5f82af17f8d9b053277bdb6fc579372abc1ed95bd1899089d5144e10bfa2889ac9b303e9defc3da7a52bedce1efda718e100010004000000473044022050c542fb4f334a2f239001f132ca5dff721da7f41bbe4d964f8e8e70ab4083c102202d5f51a02cf31e981e1144f5f3c17941ae31d05118ad9456a4cbacec53c45fad010047304402203b56a8382752caba09ed89a455f04b795f3d3c90dff082ff8e94d634aa43048e022037aca2ab94773a5ddaadb9c1c8df59bd1b4f8cf64d4d71b1a4af0d645abde640010047522102fb96863291d1a18d26cfe76269bae866563944c475a20b3d7ae84e2dc8638c7321033ffc8e31d5cef0c707970912826c2ef899a2bf1d8fde3eb5a656b66021011d8252ae",
+  "unsignedTxs" : {
+    "fundingTx" : "02000000039c19fc15f62ac474dc21cc8a2b7413e5a40ba707a76988bdefa6d805b65e4d6d0000000000ffffffff25cd88d864c3c562a1b2ae0945c014bab63b62c03f66f753873945cdf26f9dda0000000000ffffffffbc0026593894a8807a23981c2b017ad67e4c03f772b4eac223b315d012f616c10000000000ffffffff0352c5eb0b00000000220020b6ab439ba36c26405843e6da0199a1b2ec74c2846340c2377b33b65effb6d04555dcf50500000000160014c01932cc9a50383c0ccedceb2fb7200f623263d7069de11100000000160014fa00a080511ba6d572361e97276d118e34e0d94600000000",
+    "cets" : [ "0200000000010138beed1c451999622ad2f66620b1617865f6d114a9058458cfc85fdd3badd92f0000000000feffffff0100c2eb0b000000001600142caa85b2507255137031b638d81bb4e60ec5c8b40147522102586b2e25be4de8e375b8da35b675dcd96e6b4449b5b32d89ee833d65a2c0f968210259d9a49f56d95a58ca29be5b4c6d6c191c93e4c8e7e04ad5c5d09fe9819abf5052ae64000000", "0200000000010138beed1c451999622ad2f66620b1617865f6d114a9058458cfc85fdd3badd92f0000000000feffffff0100c2eb0b0000000016001451608a51e825aa0f7afdf6e985bf8686a729c2c00147522102586b2e25be4de8e375b8da35b675dcd96e6b4449b5b32d89ee833d65a2c0f968210259d9a49f56d95a58ca29be5b4c6d6c191c93e4c8e7e04ad5c5d09fe9819abf5052ae64000000", "0200000000010138beed1c451999622ad2f66620b1617865f6d114a9058458cfc85fdd3badd92f0000000000feffffff029c337d010000000016001451608a51e825aa0f7afdf6e985bf8686a729c2c0648e6e0a000000001600142caa85b2507255137031b638d81bb4e60ec5c8b40147522102586b2e25be4de8e375b8da35b675dcd96e6b4449b5b32d89ee833d65a2c0f968210259d9a49f56d95a58ca29be5b4c6d6c191c93e4c8e7e04ad5c5d09fe9819abf5052ae64000000" ],
+    "refundTx" : "0200000000010138beed1c451999622ad2f66620b1617865f6d114a9058458cfc85fdd3badd92f0000000000feffffff0200e1f5050000000016001451608a51e825aa0f7afdf6e985bf8686a729c2c000e1f505000000001600142caa85b2507255137031b638d81bb4e60ec5c8b40147522102586b2e25be4de8e375b8da35b675dcd96e6b4449b5b32d89ee833d65a2c0f968210259d9a49f56d95a58ca29be5b4c6d6c191c93e4c8e7e04ad5c5d09fe9819abf5052aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "020000000001039c19fc15f62ac474dc21cc8a2b7413e5a40ba707a76988bdefa6d805b65e4d6d0000000000ffffffff25cd88d864c3c562a1b2ae0945c014bab63b62c03f66f753873945cdf26f9dda0000000000ffffffffbc0026593894a8807a23981c2b017ad67e4c03f772b4eac223b315d012f616c10000000000ffffffff0352c5eb0b00000000220020b6ab439ba36c26405843e6da0199a1b2ec74c2846340c2377b33b65effb6d04555dcf50500000000160014c01932cc9a50383c0ccedceb2fb7200f623263d7069de11100000000160014fa00a080511ba6d572361e97276d118e34e0d9460400473044022050c542fb4f334a2f239001f132ca5dff721da7f41bbe4d964f8e8e70ab4083c102202d5f51a02cf31e981e1144f5f3c17941ae31d05118ad9456a4cbacec53c45fad0147304402203b56a8382752caba09ed89a455f04b795f3d3c90dff082ff8e94d634aa43048e022037aca2ab94773a5ddaadb9c1c8df59bd1b4f8cf64d4d71b1a4af0d645abde6400147522102fb96863291d1a18d26cfe76269bae866563944c475a20b3d7ae84e2dc8638c7321033ffc8e31d5cef0c707970912826c2ef899a2bf1d8fde3eb5a656b66021011d8252ae040047304402205f7e40abdd3fbc075defb850e2c2fec9a38791626b596160564ea7c72b78fce2022042158e9489a61cad18e1a4e47ad2cffc5b5861e9f8c16922011a3b69e8d92f6801473044022009107ed7d01e13f339e39fea0e20d4c00b23b2b90d909912fb64f4e4a8dc2eb4022005f4c72af38415eaa33f2b4491110e46987688be84297efa486daf2df3151c98014752210307de96b6171e972780bd3345b06a3bec5aea7509665f66709237b42f7db74b3821025bed925b3f93a5a9d2e23cdabcc48dfb480c041594a115d94a245efbdc5e1a7c52ae0247304402200eb90ef7c00a5ac207e8993f9ca2bea03818bec435c5d0bda047ac94814ba21b02203877ced502bb728296d6e498b156a95ddf29c1301058081ca6b038323704de80012102fdd94169de0814f523198621833110b7af158d60939929444fce40f99d1fd32700000000",
+    "cets" : [ "0200000000010138beed1c451999622ad2f66620b1617865f6d114a9058458cfc85fdd3badd92f0000000000feffffff0100c2eb0b0000000016001451608a51e825aa0f7afdf6e985bf8686a729c2c00400473044022002bb985b6782b24d162b9c7afe142acd5c2000d4f47216b7ac0a20edf51e7a9602205ffeaba1c075f4ddb83400c2dacc89e37c5bbafb207fa9de33b4b6bf5e933a6e01483045022100a188900c6aab915e1a490543ce61e3007cfcb4161e965dae9e4c7c21deff54c20220598c00b83d28da46488132c2fcb3f78e2a799822e558c595d074326ae281d3810147522102586b2e25be4de8e375b8da35b675dcd96e6b4449b5b32d89ee833d65a2c0f968210259d9a49f56d95a58ca29be5b4c6d6c191c93e4c8e7e04ad5c5d09fe9819abf5052ae64000000", "0200000000010138beed1c451999622ad2f66620b1617865f6d114a9058458cfc85fdd3badd92f0000000000feffffff0100c2eb0b0000000016001451608a51e825aa0f7afdf6e985bf8686a729c2c00400473044022053b296ee9ab2cbd810a18b6667c0a7895545a3564294f95afb1c3f740fb167840220258221defbc62780aa67aa8f5cba33d39ab0dcf3597f75bc768d7519e9b8d12a01473044022044ebc23ab539a9269fa2f51945d1f564f5df6e8b3b52066ea26e2c62c88c81f102202826a54f06adc31914a89f6b0461823d5597b73cb473097c8230019283c68fe10147522102586b2e25be4de8e375b8da35b675dcd96e6b4449b5b32d89ee833d65a2c0f968210259d9a49f56d95a58ca29be5b4c6d6c191c93e4c8e7e04ad5c5d09fe9819abf5052ae64000000" ],
+    "refundTx" : "0200000000010138beed1c451999622ad2f66620b1617865f6d114a9058458cfc85fdd3badd92f0000000000feffffff0200e1f5050000000016001451608a51e825aa0f7afdf6e985bf8686a729c2c000e1f505000000001600142caa85b2507255137031b638d81bb4e60ec5c8b4040047304402207828fc6972c3d8282126e9bc8ac738658fca1a5f82af17f8d9b053277bdb6fc5022079372abc1ed95bd1899089d5144e10bfa2889ac9b303e9defc3da7a52bedce1e0147304402207f60b9ef4a2363284afb3f4dd34ac08846e5a2ced08da79bc2782c013b1000a50220067856fbdde3c2ce1a3b98fce856919204ae700e159312eb8a1041cb508221460147522102586b2e25be4de8e375b8da35b675dcd96e6b4449b5b32d89ee833d65a2c0f968210259d9a49f56d95a58ca29be5b4c6d6c191c93e4c8e7e04ad5c5d09fe9819abf5052aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "95f5eb4c47cbcf3aaf910b10e302d414fe1638710a04fd619b81047c08125a2c",
+        "nonce" : "6e9377ff83b3e4000ac7bf39ec7b82660ebbc7a4e42da67054e792a3b7a43a29"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-3094196193545128423",
+        "outcome" : "b408cebf78ac312c19ad7ff2c4f6c2b8042f652a557bef54228cfa42d7f805c6",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "1153297833611406966",
+        "outcome" : "413d9e33459c4910648dffb3fb928506eff9d19b90612ffb70c64afeddc0f24c",
+        "localPayout" : 621102
+      }, {
+        "preImage" : "3905216222959413636",
+        "outcome" : "f866c1c918103b74cfbbc6494d35a22bb85a11495f68dc2b6d63a3be3852d384",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "413d9e33459c4910648dffb3fb928506eff9d19b90612ffb70c64afeddc0f24c",
+      "oracleSignature" : "6e9377ff83b3e4000ac7bf39ec7b82660ebbc7a4e42da67054e792a3b7a43a29444ffa5f54cd99edb0f3aff5c3a7a0934f7bf453a99965140699925ce65ceba7"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014054aa2e2e44bccd5d2a38a055707232c76887ff100000000",
+        "idx" : 0,
+        "inputKeys" : [ "165e4575ae15b8b3af5f9c3e49eab1e465e6c2f25f6490926bfe9a0aae659d1f" ],
+        "scriptWitness" : "0200210295cbaf5207709eb6fc256f888fa73ef4f0ed75e31b210b9461a4962c2a2bcac8",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qay58ya0wmr5ucs3mq8d9wkpqy8ajc0ykvfqdtf",
+      "fundingPrivKey" : "7503d09d0439e7ace1f3b153198a3b695e4fa80fd41a0b72f9c68e42018b3d21",
+      "payoutAddress" : "bcrt1quctq5h6f7wh0a2jy9zdmf6qycyv0jpwn52kjd7"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914319950cf42eb81d08f5d1c060e28d27d77ff0c108700000000",
+        "idx" : 0,
+        "inputKeys" : [ "3b7482edfa276c958e2cbd21299d23e03988fbbe41d051ef4223648cb5692626", "3622198cf997c4ac4363c9a6bd0cbea6471c9c0b8165f794da75c3c15ca582f6" ],
+        "redeemScript" : "0020813916469e5992a078c7ec76810704dd4a1ee15b2a973cbdc1804e6f7907ff26",
+        "scriptWitness" : "01475221026853167050dbe87dc3f273ef70057302bac21010b8b86f0299dc8369186b0b0e2103f76ce13a8cb26fa9e786645eae48089a272200bc2e094d35c75c37c151f7201252ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600147e37bb280fa46ffb67e69fd0ad43241691740b0f00000000",
+        "idx" : 0,
+        "inputKeys" : [ "eccbdfe5724414f2df562c06bba20eeeab416dfbe1d288f145de7b946b4ac647" ],
+        "scriptWitness" : "02002102e5c94b1b44fa29b67ea9b8497e537a744e6cde67c94f4f91247471d16400e7a7",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e8b2186657d07efd9ea3b13bcc021448b8804f140d1e4fa204220ba7a012a8d500000000",
+        "idx" : 0,
+        "inputKeys" : [ "160f59dfae6501e8181a9ad5140c8d58fa13c1aa5a3918c4560bf0f9c03e9b32", "743fca17db92cf593e8e0db0412c7d7f357d3f85603200f6d67ff868c18c5cc9" ],
+        "scriptWitness" : "0147522103ccbe203f26962ce9cba8792ba68ef6e46210bfc2689097d78e270cb9f8de405c210356718e298b4ba349403e8ea63f87ae31f704fd9cf95d3368e2c99416940f872752ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200204121e4cd4b76b622b7447348cde2d10b0ce4316a79e0444d61ce8c53ad319d5800000000",
+        "idx" : 0,
+        "inputKeys" : [ "85d3aacfca331471b0a3f5169584a08916eb4c095eb0023b9be1fef468e95112", "3643d92a5a018535e931206f09823d79e8cd23f16582f8c58d4e90a1e99ac570" ],
+        "scriptWitness" : "0147522102fbab1c993936671d5f936e5e5977503e0323ae6e80e7f1d388df5a9e66c0474e2102ad77e1590e7b21f2506260fd8c62f6453795b1c1f4418153aaca49eaca5eae8c52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9148d2db9f47d9f90d4b2818a614490661aaaa457eb8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "b95e0e4197f05b10d0a667c8bbcec4fd8cc0cd3de5759b2f61f1029c7e7ae73a", "cf7fcda8c634b7ce71a8de0692127c39804573ff2e3b4c5bc249a46e1aa76b0e" ],
+        "redeemScript" : "00200d8818e5f8de4bc625437b5b664273da5807676e1e7ad2d4ef8d05a585e87a3b",
+        "scriptWitness" : "0147522103a300823d3aaf2e48eb19db9694f1eb0bf60d2d49f7481be13ddc4d700a64cd17210316d826111ac1b0e061fa29bd47635ef0d6595616710d3fcd75a01f6cfc65386152ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qmnu7uy25hn0vdgduly26rusx0jj36jt9n4e7pn",
+      "fundingPrivKey" : "cad75f536b03da229e04f295f27a0779b55966a3c27bc3d960f4f15949111d7b",
+      "payoutAddress" : "bcrt1qykrqwcd4dzmgafqve39k8fsl0flqgjg08ha34w"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71055142d33303934313936313933353435313238343233000000000bebc20013313135333239373833333631313430363936360000000000097a2e13333930353231363232323935393431333633360000000000000000fda7124095f5eb4c47cbcf3aaf910b10e302d414fe1638710a04fd619b81047c08125a2c6e9377ff83b3e4000ac7bf39ec7b82660ebbc7a4e42da67054e792a3b7a43a2903620a919faddb90e6f162f87fa78330a09d11adf85c8c15f084ecdda2ab5bde6a00160014e6160a5f49f3aefeaa44289bb4e804c118f905d30000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014054aa2e2e44bccd5d2a38a055707232c76887ff10000000000000000ffffffff006b000000160014e9287275eed8e9cc423b01da57582021fb2c3c96000000000000000500000064000000c8",
+  "accept" : "a71c19d54b50dde6745534fe8084737807268ae46c23a0ea7c82aed93ff7c83991400000000005f5e10002a561d38fe92a706b05c66e90cb0dd08e377dbfb33b0186810b879602ac6631650016001425860761b568b68ea40ccc4b63a61f7a7e04490f0005fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914319950cf42eb81d08f5d1c060e28d27d77ff0c10870000000000000000ffffffff00da00220020813916469e5992a078c7ec76810704dd4a1ee15b2a973cbdc1804e6f7907ff26fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600147e37bb280fa46ffb67e69fd0ad43241691740b0f0000000000000000ffffffff006b0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e8b2186657d07efd9ea3b13bcc021448b8804f140d1e4fa204220ba7a012a8d50000000000000000ffffffff00da0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200204121e4cd4b76b622b7447348cde2d10b0ce4316a79e0444d61ce8c53ad319d580000000000000000ffffffff00da0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9148d2db9f47d9f90d4b2818a614490661aaaa457eb870000000000000000ffffffff00da002200200d8818e5f8de4bc625437b5b664273da5807676e1e7ad2d4ef8d05a585e87a3b00160014dcf9ee1154bcdec6a1bcf915a1f2067ca51d4965fda716fd01e601391e85b56e3729ae1f5413eafb3bc1dcb8d816e4c45782dc199128d288f42c35cea384c315d6ad72ed0ef961e66aa71952b97d9ca36599317f3c26ffe7f8ba58017eec39656d67720e08dd1aa256dbfe1a28cfa8e8f4c116c8b5593ea4b233783d8b4e1c23e0882b3e892f853521775eb76048827187b4fc598f2ff8a55d9a6115b43ea038d6e3d5721c522b37a3ef1ae941a5021d8c856ebd7630732250ed859500c48452c24ec5ddb2b7f2123eb76a21e5dc722a591a58ed32b39fa7eded1947d84e560a1d3ecec8b7395a073599e73b32132b6992f8e0329783d0039a0913a28d018ce0e1a61857a01d8feaab5674317f73c09b425889639d0f0830de130e9b31355e8228fadda2c3adc08691fd43d62f03695f864f6041e9da554ae0a3dce43565cb47f552ea3306955f011595c65fd86bcd5d49ac5531a57b76a2c1955d9950b3005824e62366354b4ecabdcef156bbf111536f5969533e877e3b5f8139a2d2e4d4adbc768bf7409485c01a39e3500d1cb25cbc7b960357575f743c6f6179a52c9601d39e444dd439966ba35ecce7ed112f91e4e1c789c21ed471354806415df97e611562a6eab5e889a126484c65d9e1dbd6b551e416dd726f67af1eb8ad5476fbb319062f6976d9a45f41a0fcaa96e28acc790b4ba5756e65dd92aa76d3fa801a2a34d70ace345f82d974617a2fff07a3ee822af09b67d05de1c8f437d6b128a5cc287ac53d5d5e4a3dc606991032875317f7dcdac2754730029d173f1fe6b14146",
+  "sign" : "a71ec76f7afc75634670e21466feb3274716ce0ee9a84a5e79c0592f4aa7afaa72e4fda716fd01e6002f4f70561930fc848a8152b3f2c3f155a94529167bff392bf6160e97ae0d3edb49b64029ec93d1b657a11c4d371593d9e1979b34965ffa4958bb1b16e2f73141010e1a475078b8312a690c2fc6c69a9dbc9701b1655a1a576e13dbb5c3cdf8511d3dac44b4637f47b8ff5bdca0827a4c0d821ef9aa0cbe86be22469a3f4c4d32fa36abeb45dd21a6e0c4f157c4676513f99a6a24b238b5b02cf8224f5c7e2c97030132de9ecd47eafd651c6f56e0bd3031f0c521d61fb611a9397463f0a5d78845a47e5461fdcc36f219cb9cc8b3ad5e087a2098a3890beea75f3c7f8a09ba332f6201932576520502812aaf38e7852d39e03c6b9afa1cd5a6a758212c1ba69458767163820b8b4aef40b704cfb71f44f78af8c2379239c1a6c1e7a385f28043d1b785f800fe37fa9f3f3f7a5f0ceefc453df820d3e502165daa02f71239e71665030d018fa98923eff58197aae391c0eabd45ecaa8b6f4dc450613195052b657bed627e16d27dbd5d55f6d3dca7092c97181556bede19a57c886061d6d07126bf254b260120e2dd39a7dad3087c69e6ef8a5d743f89f2dc6ed1c0596e7965ad7de5ca336b437c5db512f17973511671003e450bd26d04bd087a03121ee137c6c306b7d499f3aa1856445fffaf99a901900393740481339cd33125108a9a223f6f82148d3736fa0108ed61f36cdd65ff4ccd745666f1e6c7ed3197be7f4f2682b8ea04bca1200497b55f896e0ecab342ed69a45dda878d86e064a77d17eadc49f266bf6a62fda718700001000200473044022054a0b3579b42bf56435a28ccd19f43071a6b20541111ca4543d803136c5e4c8802207b4a53390e064f205021cd2e208cc6382cb6b2fbf2023e1c332eda60f8b8eb640100210295cbaf5207709eb6fc256f888fa73ef4f0ed75e31b210b9461a4962c2a2bcac8",
+  "unsignedTxs" : {
+    "fundingTx" : "02000000060d272c900b304883fe3a3f43b2e199d1192264e30fd8e5c14efd9aa31d2ab97a0000000000ffffffff76d9f517198b96dcc40b27fb799c7aeaee7a2bb6572cc1f12b6413e7836543540000000023220020813916469e5992a078c7ec76810704dd4a1ee15b2a973cbdc1804e6f7907ff26ffffffffae28bf85f1b2864976282310fdfd93bef164ab517a717da5df57b73a606e36b90000000000ffffffff7753df0a1952594602bca73919ea3d81c0245c58c05f45b1e39ece7f38c421580000000000ffffffff71659f5256f5e940118d037f64bbf63616f500a04d6ed23db6736ecac4ff1a7f0000000000ffffffff760758df98a4f444359a6412de02d1eee0d8f62886c126c60a235813c309095200000000232200200d8818e5f8de4bc625437b5b664273da5807676e1e7ad2d4ef8d05a585e87a3bffffffff0352c5eb0b00000000220020e99b3dea8fd1ce17e527ab6dc5b7638b98292ee9036f374798651a5f1a2c0e64e1dcf50500000000160014e9287275eed8e9cc423b01da57582021fb2c3c960ddca43500000000160014dcf9ee1154bcdec6a1bcf915a1f2067ca51d496500000000",
+    "cets" : [ "02000000000101a4e393675075f6f74205b4ea8b85ea4430405fc07ae6ead6253285a8ac31bade0000000000feffffff0100c2eb0b00000000160014e6160a5f49f3aefeaa44289bb4e804c118f905d30147522102a561d38fe92a706b05c66e90cb0dd08e377dbfb33b0186810b879602ac6631652103620a919faddb90e6f162f87fa78330a09d11adf85c8c15f084ecdda2ab5bde6a52ae64000000", "02000000000101a4e393675075f6f74205b4ea8b85ea4430405fc07ae6ead6253285a8ac31bade0000000000feffffff022e7a090000000000160014e6160a5f49f3aefeaa44289bb4e804c118f905d3d247e20b0000000016001425860761b568b68ea40ccc4b63a61f7a7e04490f0147522102a561d38fe92a706b05c66e90cb0dd08e377dbfb33b0186810b879602ac6631652103620a919faddb90e6f162f87fa78330a09d11adf85c8c15f084ecdda2ab5bde6a52ae64000000", "02000000000101a4e393675075f6f74205b4ea8b85ea4430405fc07ae6ead6253285a8ac31bade0000000000feffffff0100c2eb0b0000000016001425860761b568b68ea40ccc4b63a61f7a7e04490f0147522102a561d38fe92a706b05c66e90cb0dd08e377dbfb33b0186810b879602ac6631652103620a919faddb90e6f162f87fa78330a09d11adf85c8c15f084ecdda2ab5bde6a52ae64000000" ],
+    "refundTx" : "02000000000101a4e393675075f6f74205b4ea8b85ea4430405fc07ae6ead6253285a8ac31bade0000000000feffffff0200e1f50500000000160014e6160a5f49f3aefeaa44289bb4e804c118f905d300e1f5050000000016001425860761b568b68ea40ccc4b63a61f7a7e04490f0147522102a561d38fe92a706b05c66e90cb0dd08e377dbfb33b0186810b879602ac6631652103620a919faddb90e6f162f87fa78330a09d11adf85c8c15f084ecdda2ab5bde6a52aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "020000000001060d272c900b304883fe3a3f43b2e199d1192264e30fd8e5c14efd9aa31d2ab97a0000000000ffffffff76d9f517198b96dcc40b27fb799c7aeaee7a2bb6572cc1f12b6413e7836543540000000023220020813916469e5992a078c7ec76810704dd4a1ee15b2a973cbdc1804e6f7907ff26ffffffffae28bf85f1b2864976282310fdfd93bef164ab517a717da5df57b73a606e36b90000000000ffffffff7753df0a1952594602bca73919ea3d81c0245c58c05f45b1e39ece7f38c421580000000000ffffffff71659f5256f5e940118d037f64bbf63616f500a04d6ed23db6736ecac4ff1a7f0000000000ffffffff760758df98a4f444359a6412de02d1eee0d8f62886c126c60a235813c309095200000000232200200d8818e5f8de4bc625437b5b664273da5807676e1e7ad2d4ef8d05a585e87a3bffffffff0352c5eb0b00000000220020e99b3dea8fd1ce17e527ab6dc5b7638b98292ee9036f374798651a5f1a2c0e64e1dcf50500000000160014e9287275eed8e9cc423b01da57582021fb2c3c960ddca43500000000160014dcf9ee1154bcdec6a1bcf915a1f2067ca51d496502473044022054a0b3579b42bf56435a28ccd19f43071a6b20541111ca4543d803136c5e4c8802207b4a53390e064f205021cd2e208cc6382cb6b2fbf2023e1c332eda60f8b8eb6401210295cbaf5207709eb6fc256f888fa73ef4f0ed75e31b210b9461a4962c2a2bcac8040047304402207a37ea745b19fd35ef36b64be710c5e2f558c53e4e92f9659b4f736588402f5702200f7e63a00b29cc4787d366594c7322d8b12ec765c827e8d404301674994e17350147304402200d0ec98db707e77855d9d0d5e7fd17b901cca1db6d7a0968c5098524bff4c23902205f63ba804011ba7c40eb2bcd099de487f6652ffe517bf0d2027bc0cb75cecdbf01475221026853167050dbe87dc3f273ef70057302bac21010b8b86f0299dc8369186b0b0e2103f76ce13a8cb26fa9e786645eae48089a272200bc2e094d35c75c37c151f7201252ae02473044022008471a0df531ea586de9d02b74e14402470c4199e7c5097d8636cae05478245f022078a26a385c02c5356b81e058a0ce4a8b74a40e75ddd9bf0d4eb32c1a1e3ce812012102e5c94b1b44fa29b67ea9b8497e537a744e6cde67c94f4f91247471d16400e7a70400473044022068993424a0d33c54287bf204cd373777900d7ac290a21cb405dd509324477a0a02201a5f08a5e5e69b47ee66662fcea55fc1ed40d7419c52d66280f30c6a64c5923e01473044022072068b9fe73f805c70360094036a4c87d5442cff1beedb07058ec6655cbd5536022004b36d78938c374e04f40181a92e4c78d85658018d4ec5ee412477f1677afe690147522103ccbe203f26962ce9cba8792ba68ef6e46210bfc2689097d78e270cb9f8de405c210356718e298b4ba349403e8ea63f87ae31f704fd9cf95d3368e2c99416940f872752ae040047304402207d2bd55478f03460fbf823ba2620937f7310e6442787d22fe31ccec337fb6a28022058f58f21af594472b8f3f8a589f71337c76d28cbeec69ae942e3fc915f9adab901473044022017393cfec42b800715f85dcaa7a7ae1d261c3f7cb88f4174366706478178528602201f1bffb65637ab54e30afa3814205c88e4da4aa07001747a52f87089c282e0ec0147522102fbab1c993936671d5f936e5e5977503e0323ae6e80e7f1d388df5a9e66c0474e2102ad77e1590e7b21f2506260fd8c62f6453795b1c1f4418153aaca49eaca5eae8c52ae040047304402204afb0fec64bccfdc512fa99bfacdde5c5df493a537bc548238dc5c97b0d98fee022060bca5ee7bb0c0d5164c3e3a3dc331f28e5224c2e88ac457327b3e37faae411a014730440220339c2a8910ed83741c77a85a6d676c52b4511ac6f1ba9eea8cb20d06bde9a6bb0220760f83c1c297603614396cbbeb86be887e707013315728469621a4761490e62c0147522103a300823d3aaf2e48eb19db9694f1eb0bf60d2d49f7481be13ddc4d700a64cd17210316d826111ac1b0e061fa29bd47635ef0d6595616710d3fcd75a01f6cfc65386152ae00000000",
+    "cets" : [ "02000000000101a4e393675075f6f74205b4ea8b85ea4430405fc07ae6ead6253285a8ac31bade0000000000feffffff022e7a090000000000160014e6160a5f49f3aefeaa44289bb4e804c118f905d3d247e20b0000000016001425860761b568b68ea40ccc4b63a61f7a7e04490f0400483045022100c48452c24ec5ddb2b7f2123eb76a21e5dc722a591a58ed32b39fa7eded1947d8022039c282b344a8f178ee841ecc5faba0384e4d6b014ddf210116f113d60c6624f6014730440220611190da743938d8da534397a75ff8d7fee2362bc4a4f8c6cbf2e9b02e7cbec6022013a114e845c2a8d0e63756123fa742e569557614e1651814a447062c11ff5de30147522102a561d38fe92a706b05c66e90cb0dd08e377dbfb33b0186810b879602ac6631652103620a919faddb90e6f162f87fa78330a09d11adf85c8c15f084ecdda2ab5bde6a52ae64000000", "02000000000101a4e393675075f6f74205b4ea8b85ea4430405fc07ae6ead6253285a8ac31bade0000000000feffffff022e7a090000000000160014e6160a5f49f3aefeaa44289bb4e804c118f905d3d247e20b0000000016001425860761b568b68ea40ccc4b63a61f7a7e04490f0400473044022067e2e825bf9604c2e39f135674087f2653165019cf1a505f638fffb6c6c41c28022052fa1745f597ee406a695f99b21a16f6b04cc86b0d4ac2db1debe44e308522e001473044022032de9ecd47eafd651c6f56e0bd3031f0c521d61fb611a9397463f0a5d78845a402201a7768da804d82db5ac97aaf312d2ac4aac644dc951104e61a54cdd41c552ee60147522102a561d38fe92a706b05c66e90cb0dd08e377dbfb33b0186810b879602ac6631652103620a919faddb90e6f162f87fa78330a09d11adf85c8c15f084ecdda2ab5bde6a52ae64000000" ],
+    "refundTx" : "02000000000101a4e393675075f6f74205b4ea8b85ea4430405fc07ae6ead6253285a8ac31bade0000000000feffffff0200e1f50500000000160014e6160a5f49f3aefeaa44289bb4e804c118f905d300e1f5050000000016001425860761b568b68ea40ccc4b63a61f7a7e04490f0400473044022034d70ace345f82d974617a2fff07a3ee822af09b67d05de1c8f437d6b128a5cc0220287ac53d5d5e4a3dc606991032875317f7dcdac2754730029d173f1fe6b1414601473044022036fa0108ed61f36cdd65ff4ccd745666f1e6c7ed3197be7f4f2682b8ea04bca10220200497b55f896e0ecab342ed69a45dda878d86e064a77d17eadc49f266bf6a620147522102a561d38fe92a706b05c66e90cb0dd08e377dbfb33b0186810b879602ac6631652103620a919faddb90e6f162f87fa78330a09d11adf85c8c15f084ecdda2ab5bde6a52aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "2c2c849581bf61d218194517b55873e74895591ffd8a6488815aa62af06e94d6",
+        "nonce" : "27c5998b1587e1323a3da98b9150bf41e4b83cc8845f3fa5512f862a17d56695"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-39030812566163825",
+        "outcome" : "c809f4dc1fd6a9aa2e9b583e935ceee06290020ce3e1ad7bea206a46ce39ce6c",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-455004484500198017",
+        "outcome" : "1fe899e9be98020be5429d289486260129118c07a739962a38bb4b7d6b8c8a7d",
+        "localPayout" : 0
+      }, {
+        "preImage" : "4379810542143819365",
+        "outcome" : "983df42333a1cd30f5e72c84565238681a295a099fe0de60166566fe20a3c4b9",
+        "localPayout" : 94294169
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "1fe899e9be98020be5429d289486260129118c07a739962a38bb4b7d6b8c8a7d",
+      "oracleSignature" : "27c5998b1587e1323a3da98b9150bf41e4b83cc8845f3fa5512f862a17d56695a3f4d011d5e2eb9094c4d65b66e9c69bf1ebc06c47efe4a40f0a1f91daeee5f5"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020f9b409b5e64d9a2dae780e6c7b55ea385728df4e153c95feb39cc7936fe5ed7500000000",
+        "idx" : 0,
+        "inputKeys" : [ "819b4f7171e370d3430edb4e4d30f02258660f62e3f425116bd7bf830f02dcd8", "694f21f9903ae313ad03134a0a82ed75685f5c7429370ae257ca7b5a021272b7" ],
+        "scriptWitness" : "01475221028e6c1b292b4455f690bbe92c1cdca2c639087c72061276aedc48a80167df18e4210269cbdd73ce6b30e8d53ec45fa61da71310a12cc9bd4d167e34cc25370a336ec052ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001403c2d5557008294947a1f95c33a6e4aab96c868500000000",
+        "idx" : 0,
+        "inputKeys" : [ "b40e5987d48e19804267214d1f254f5b00623f7b1b13062f46cd117f6aa8171f" ],
+        "scriptWitness" : "02002103790145d3c5ff33e528d1a14007947b0b9c7acd2bd907d7c8172d44802a36ffb0",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qtt9z3aewpuwcmcz9dq878emaajupv8tqxw28v5",
+      "fundingPrivKey" : "5fce96d2ddf3bcd0712094d2cfc9dfe471b15755a5e6262e9fdba9c0075c663c",
+      "payoutAddress" : "bcrt1qhs5p0cwwcpzlys6q6r4wl7utyqzg5cdruzczlt"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209bb7f48582f24968749799c8010d4e12aa3dbc454fa598d7a3cb679946933e4800000000",
+        "idx" : 0,
+        "inputKeys" : [ "e23b47a398cd994aaad819f8fca810a354f2918bab1b8cd2a668d4388d07b0f8", "28fb0dc8977b1db9530caf8e598ce2614285549937389cab7bf1d7005783a851" ],
+        "scriptWitness" : "01475221022c5f5b3c5d7df4d0d75e31da779cffabdf6fbdde08a0efe959bae0dc3d8d6b342102393a82d48d5e35ec448e541661d1eac13f0faacc9a29a43b405e8f64cbf593fc52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qw8mem7wutr8a3wguzhzzk7fnz33np2aju8hm0z",
+      "fundingPrivKey" : "ab1b0a7234813a2e61f547d42aacaa136450c6ea87a607c194f1ffa8c06888b7",
+      "payoutAddress" : "bcrt1q8tx6lmfrgqd8yun92jgywyn0cl9wj8h80qx07j"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71053122d3339303330383132353636313633383235000000000bebc200132d3435353030343438343530303139383031370000000000000000133433373938313035343231343338313933363500000000059ed099fda712402c2c849581bf61d218194517b55873e74895591ffd8a6488815aa62af06e94d627c5998b1587e1323a3da98b9150bf41e4b83cc8845f3fa5512f862a17d5669503a550e1ca3a84840158ecc6b227e1fb9ac939097f4b14a1e1c09cb57662c2b8c300160014bc2817e1cec045f24340d0eaeffb8b20048a61a30000000005f5e1000002fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020f9b409b5e64d9a2dae780e6c7b55ea385728df4e153c95feb39cc7936fe5ed750000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001403c2d5557008294947a1f95c33a6e4aab96c86850000000000000000ffffffff006b0000001600145aca28f72e0f1d8de045680fe3e77decb8161d60000000000000000500000064000000c8",
+  "accept" : "a71c1d7e3a873acc8132d72e34876ae7607d332a670b996ea8851b5dfbe80cc047550000000005f5e10002149ae62842a6b13be6d3d91813aefb38e349a7a723a5465a7df00f9e880681ed001600143acdafed23401a727265549047126fc7cae91ee70001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209bb7f48582f24968749799c8010d4e12aa3dbc454fa598d7a3cb679946933e480000000000000000ffffffff00da00000016001471f79df9dc58cfd8b91c15c42b7933146330abb2fda716fd01e601bfc01ecb67d32a9feaddaa8afb01554da5b7b8d8b79f9bc158802da301a2042d92c85f342d68c1c8794b2bdbcc280753ac782ef1efe10da1da203835fb8bd2e5002fb2586c6ca1037a9d625a2ab84166cf08c3bd34134f47bef5b5e17a57c3ee69eed496d028cc0e14e671d23bca2dd0d0bd3e666e6040038eb3c0247e8355a4f0371db36b31428b733bbb8be400de42b19dbf7a9c5e68d8dcdf7c04b27fe42a6a014159031cad8e8b0459592405313dcb733f1f638d8a4422352aaea3b8f61b4ab9cdc491de712a03ed11157190e7ce9288e42a29998eb6ccc4f725c58f394710e90030aec7ff9d16fc75887a92d96d89068f4674e61143970c47f527a3937f02b67e3c95d728fe2ffbd0c17a3ae8c3302d41343efe167593e04f15b6a6fc63f74b58536a28555c5366443f6a7b4be2d273ab0cb6db38927da390215f888fdea5916a0082c061ee8bb1b40591fb2ad63e673e7d678f237fd8ba2feee921c45021e54cecc95f918461228c7bb143003b2371011ca8006139cf233e915dd150c617d58ff000912df26c5e29b73ea3340e1b32c6858be02a11f1dc8a90caa548b2271196e9a6b96c24aafa96259926983c0d36e3aed9dd19eec2408e62b939df3774a4c74c2df44971061b01751cfc8078b2cb914fc0aaf4af664eb834b931b7266cd09a238a78a79a7c8a7c5c435f08b25128044709483adbac443d94125313638267e1d636141d1b0754561e411e0c5642d4e064f05d3bdba0ca73d91145eeacda2184fe89",
+  "sign" : "a71ef00471f8532f93c6cd3057d33c10fe919a695b935101242e90d457acfe171d1efda716fd01e6011deafa64ff2428d98e3c8af34101024480fcda9b97895670261ebeb028a5d57da4d24008420e4a9b58714fc495443abb83161d934c6279f4bf09e29cc1ce0e01013bef19ee47325081c08f3c37cc477f667e11903ae4a9b521b931ebb174ecd732b00a3bb42c242dabffce4aa660d3ee0f95578a111eff3797c694ecbf2ac4612195466866ba3ba1ff8ef2b4d22a5f446d0812933b54884900e77ed4b322df511501310a62344beb925b4e6a01557d8495d10ff0f82e5659aa156619d36e6937d49b61540939331ced90be96492074151a37f02ba903eb2f059615908c3bfe950f8b01a9f57526ffa9eab3de1a5d81dd51771b83d062ec8251979eb9de790d6f8196bf2bc573dfe02621d47db3d71440de9f516c8a13cd0abfc490b8b9abeeaf50153ac74de4d4812361dc80f0760b4de8b490db1f267f0c0f45e7b6d4dfefd3a818bd012fc69819fb215cf5b627b46dfb99ca5c4d743a1fb5ada8dfc9948cd7474013bdbce39b42ea32ebcf7026cd61de324bd9a6969e64f7f713d8deddc1e7c0bb385c015d9b39e3bfef4d67bec3ab543c0cccf56d6a33f35107474ed1cbca1bb3cf81bc2f665282e321e34cb0bc13ff935ea32fab48fe707232acc5f9710a87435fa8ee870c0f5f929dd018899c5d9d42412fea4a1dac7ae5958d8fc820029edf5be35239510fc486317d5d91afe8612f4293b0032eb9e283fa3387881b9fe26333f85e17e4ec79a0ca7637bf2fc6c7cebd5cc50195baeeb9b8e1a45ab42eceebb9d9d8fda718fd014f0002000400000047304402205af265c8cdf72e302f312ac0892ac47a51ac3f1ee3a7d8d112e47fe657d44879022070fb3f8917f9acd13e0aa8d85e1af3a65ab6d3ba65bc6a00df2d1c120d9593210100473044022008e18b13fab322608a66701a815c5c2f07582f6a81763b306eabdc61e53299f402207edf4d487e977cf92d69f539bdd65e89b66cd9411e63ddde4ebd949542b3e0e20100475221028e6c1b292b4455f690bbe92c1cdca2c639087c72061276aedc48a80167df18e4210269cbdd73ce6b30e8d53ec45fa61da71310a12cc9bd4d167e34cc25370a336ec052ae00020047304402201e2eaef98ae0ba39572e1c7f8eebc2beb5785b348f45f63fcd57135e6d7acc21022066a8349e32af9e560b358f412a9613f18e9cb7d03d036114baa0600359088afb01002103790145d3c5ff33e528d1a14007947b0b9c7acd2bd907d7c8172d44802a36ffb0",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000003933575ca2547ce06f166dd9a5f4f9f424509647f087b7750d9b137fa7744cc200000000000ffffffff323fe793e4e7c6fbb716023119ea1b65a605855b3c0dcc6529c4c4ffd3ceb78d0000000000ffffffffa4699a1e612b7c6e635aa70ec5f1a05459cce05ddb51fc82aa8a70ea86588c820000000000ffffffff0352c5eb0b000000002200200b99db1cbeee087594031c2154d02f27694a7013eca5e7cd928ebe0c1edb4616069de111000000001600145aca28f72e0f1d8de045680fe3e77decb8161d6055dcf5050000000016001471f79df9dc58cfd8b91c15c42b7933146330abb200000000",
+    "cets" : [ "020000000001014b5ad7f244ac898bab8c6fc8983c43a9ec9ef75654631e1af412e3697f4b7aed0000000000feffffff0100c2eb0b00000000160014bc2817e1cec045f24340d0eaeffb8b20048a61a30147522102149ae62842a6b13be6d3d91813aefb38e349a7a723a5465a7df00f9e880681ed2103a550e1ca3a84840158ecc6b227e1fb9ac939097f4b14a1e1c09cb57662c2b8c352ae64000000", "020000000001014b5ad7f244ac898bab8c6fc8983c43a9ec9ef75654631e1af412e3697f4b7aed0000000000feffffff0100c2eb0b000000001600143acdafed23401a727265549047126fc7cae91ee70147522102149ae62842a6b13be6d3d91813aefb38e349a7a723a5465a7df00f9e880681ed2103a550e1ca3a84840158ecc6b227e1fb9ac939097f4b14a1e1c09cb57662c2b8c352ae64000000", "020000000001014b5ad7f244ac898bab8c6fc8983c43a9ec9ef75654631e1af412e3697f4b7aed0000000000feffffff0299d09e0500000000160014bc2817e1cec045f24340d0eaeffb8b20048a61a367f14c06000000001600143acdafed23401a727265549047126fc7cae91ee70147522102149ae62842a6b13be6d3d91813aefb38e349a7a723a5465a7df00f9e880681ed2103a550e1ca3a84840158ecc6b227e1fb9ac939097f4b14a1e1c09cb57662c2b8c352ae64000000" ],
+    "refundTx" : "020000000001014b5ad7f244ac898bab8c6fc8983c43a9ec9ef75654631e1af412e3697f4b7aed0000000000feffffff0200e1f50500000000160014bc2817e1cec045f24340d0eaeffb8b20048a61a300e1f505000000001600143acdafed23401a727265549047126fc7cae91ee70147522102149ae62842a6b13be6d3d91813aefb38e349a7a723a5465a7df00f9e880681ed2103a550e1ca3a84840158ecc6b227e1fb9ac939097f4b14a1e1c09cb57662c2b8c352aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000103933575ca2547ce06f166dd9a5f4f9f424509647f087b7750d9b137fa7744cc200000000000ffffffff323fe793e4e7c6fbb716023119ea1b65a605855b3c0dcc6529c4c4ffd3ceb78d0000000000ffffffffa4699a1e612b7c6e635aa70ec5f1a05459cce05ddb51fc82aa8a70ea86588c820000000000ffffffff0352c5eb0b000000002200200b99db1cbeee087594031c2154d02f27694a7013eca5e7cd928ebe0c1edb4616069de111000000001600145aca28f72e0f1d8de045680fe3e77decb8161d6055dcf5050000000016001471f79df9dc58cfd8b91c15c42b7933146330abb2040047304402205af265c8cdf72e302f312ac0892ac47a51ac3f1ee3a7d8d112e47fe657d44879022070fb3f8917f9acd13e0aa8d85e1af3a65ab6d3ba65bc6a00df2d1c120d95932101473044022008e18b13fab322608a66701a815c5c2f07582f6a81763b306eabdc61e53299f402207edf4d487e977cf92d69f539bdd65e89b66cd9411e63ddde4ebd949542b3e0e201475221028e6c1b292b4455f690bbe92c1cdca2c639087c72061276aedc48a80167df18e4210269cbdd73ce6b30e8d53ec45fa61da71310a12cc9bd4d167e34cc25370a336ec052ae0247304402201e2eaef98ae0ba39572e1c7f8eebc2beb5785b348f45f63fcd57135e6d7acc21022066a8349e32af9e560b358f412a9613f18e9cb7d03d036114baa0600359088afb012103790145d3c5ff33e528d1a14007947b0b9c7acd2bd907d7c8172d44802a36ffb0040047304402203e1794ff7b7d2cbcb8b09990afe92d1cc2ab8afb2437c350072c8775c07105850220116698dbe28f7bb40297f16c150007783b01e3d5f48c3d1b398165055f0f167a014730440220131070b2ac1e48722db5829ee5b11112a88d62b46138dfd62ee37941f70e1558022067019597250e3bc235d002b84c43f2bf9f67a8dd2410fad4f3697eb8b84a16f201475221022c5f5b3c5d7df4d0d75e31da779cffabdf6fbdde08a0efe959bae0dc3d8d6b342102393a82d48d5e35ec448e541661d1eac13f0faacc9a29a43b405e8f64cbf593fc52ae00000000",
+    "cets" : [ "020000000001014b5ad7f244ac898bab8c6fc8983c43a9ec9ef75654631e1af412e3697f4b7aed0000000000feffffff0100c2eb0b000000001600143acdafed23401a727265549047126fc7cae91ee7040047304402204159031cad8e8b0459592405313dcb733f1f638d8a4422352aaea3b8f61b4ab902207ef50f19fb13f5093ff6fbd5f47297d7fd1b4f2304d9b5dc222c8c3b1547ad7a01473044022019dfbd49c1c7e7e889df91b4ddc6f671368e6bfda2133106da7ac39541883b2e022056c8e7970f07f399a67adef036010951201646fc3db2b11157990d86a8c6343c0147522102149ae62842a6b13be6d3d91813aefb38e349a7a723a5465a7df00f9e880681ed2103a550e1ca3a84840158ecc6b227e1fb9ac939097f4b14a1e1c09cb57662c2b8c352ae64000000", "020000000001014b5ad7f244ac898bab8c6fc8983c43a9ec9ef75654631e1af412e3697f4b7aed0000000000feffffff0100c2eb0b000000001600143acdafed23401a727265549047126fc7cae91ee7040047304402200fdf5255b0bf08c6d8ec20555777c4fc707ae5bdb91d832faf88b15e48bc3a23022037cd14f8b0ea5039da0aec00d54bd58ab762c61036261a32d3f77eb9e272e6f2014730440220310a62344beb925b4e6a01557d8495d10ff0f82e5659aa156619d36e6937d49b0220019f3e5456c4b9f9be2d5a19f1324fc1b37db11f76ac0d1fcaa36b56c9f3ed500147522102149ae62842a6b13be6d3d91813aefb38e349a7a723a5465a7df00f9e880681ed2103a550e1ca3a84840158ecc6b227e1fb9ac939097f4b14a1e1c09cb57662c2b8c352ae64000000" ],
+    "refundTx" : "020000000001014b5ad7f244ac898bab8c6fc8983c43a9ec9ef75654631e1af412e3697f4b7aed0000000000feffffff0200e1f50500000000160014bc2817e1cec045f24340d0eaeffb8b20048a61a300e1f505000000001600143acdafed23401a727265549047126fc7cae91ee70400473044022078a79a7c8a7c5c435f08b25128044709483adbac443d94125313638267e1d6360220141d1b0754561e411e0c5642d4e064f05d3bdba0ca73d91145eeacda2184fe8901473044022039510fc486317d5d91afe8612f4293b0032eb9e283fa3387881b9fe26333f85e022017e4ec79a0ca7637bf2fc6c7cebd5cc50195baeeb9b8e1a45ab42eceebb9d9d80147522102149ae62842a6b13be6d3d91813aefb38e349a7a723a5465a7df00f9e880681ed2103a550e1ca3a84840158ecc6b227e1fb9ac939097f4b14a1e1c09cb57662c2b8c352aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "7005e5d943de7273f642a361c0ef8214992327691c5d3fe0e147d4be18dbb5a1",
+        "nonce" : "6089147cff2acb27bf18857f0ebd823e8e427361d70b31a472ad46ce59d4a142"
+      },
+      "contractInfo" : [ {
+        "preImage" : "9188741866727584295",
+        "outcome" : "3e7a9f6e0740cb68cc737ff331f5dd2dad9f18042854dc4f3e2022d424b73af3",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-2344858619805700218",
+        "outcome" : "c1c5b0158f9ef9768e5a616699e69dcf7d6ae5866e968a613ad89c17385190dd",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "7935828768218998644",
+        "outcome" : "f1d4928fa2da14e8588bd138304320ddfaadcb95cc8721b2e35602ad5fe522eb",
+        "localPayout" : 151795756
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "c1c5b0158f9ef9768e5a616699e69dcf7d6ae5866e968a613ad89c17385190dd",
+      "oracleSignature" : "6089147cff2acb27bf18857f0ebd823e8e427361d70b31a472ad46ce59d4a1429eb2975c5db31e751b4bf3640dbc40a3fba266abbd7484e9549857386685b607"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001440c9a40b0e914695d6e7131be90a4f9ff9f76fd900000000",
+        "idx" : 0,
+        "inputKeys" : [ "81cebe4ee1da7e7c220d3a90108d7d6f7ac5fc5489ef2dc6bf711adeef1639aa" ],
+        "scriptWitness" : "020021032eb8c36c51d6dbc83f1bf3619973e1b2f886773d0e02bbdc4c8b779ec2dd2b16",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91490824633ffc5774daca2bf05eb0dd9d803cf36fc8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "6b8f0c15e23ec11488c68ca6818fd455abd1bb209b4a7d0947f7d3718ce440ef", "3bfdc3f801c8f92c4c09f0d507c18a59797176a3e705aec8c9def9c63fd2514e" ],
+        "redeemScript" : "002015aca05dd68a3353331d24b3577f7de1c1f909bd80c2670268554f6680e965a8",
+        "scriptWitness" : "0147522102b184ce899ce1a69bdb28dbee027a5686f9ea9a46ef5a1c603b2780787fc2d8a3210271e413a805f92aefc7dd9e2ed0e7f37832b8174fffa928879a8b86f506495f1f52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q069daap2np3fhjlsn8ms0sjqzx5tqpcgcfqta8",
+      "fundingPrivKey" : "ad8e282cbcd8434dfc80dd9e5a5b5e3d93e1f222680528d4ee968b0891168fd0",
+      "payoutAddress" : "bcrt1qamtjr8qjq866mavfaevfer8d8lp73wyu6k3vdk"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9148210f15e152dd2cce576ecbde816eb43bddb26e28700000000",
+        "idx" : 0,
+        "inputKeys" : [ "ffbad2e29daadf7c3a3930ea947a6aaebc7cc0a3d3a2a28c9b3ef0aa66558da2", "08dc8fc2f5827e97bc62a78a35e39c6c1472d4fbfa9224cf52c5c06c6414ca16" ],
+        "redeemScript" : "00205b3100f743ad13354f6b54cd92b3ebc3f4080cc166cf3aa4d7c13773032de5ae",
+        "scriptWitness" : "01475221029bcd6bd92d735dd55c6066b3c89c36a4cd8bd08881359e6701cb3c4e69bb0f1721023f953836ca0c12e1e9ae50761778d42d15673e43b6e58d067c7e2da053a26dcc52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020fe8178a237bbd5d4e8d2e80f127baf260cbf9387b690476ba8a8d20a668ae15600000000",
+        "idx" : 0,
+        "inputKeys" : [ "ed0fde13c3d790201221e03ef3587cb39ae3f931e111879f09f9bd07be4c7b30", "bd2a208ee7a50e5612f0a67c1e7b749bbbfde6717324bc2be72d6442b46c7f89" ],
+        "scriptWitness" : "0147522103653720f9b425948c3b694df791a8dba60de7252aa2b4f09411fcb9155ff0d017210345b5e430839a7dbc87c38ba0ff54b2104200550bfeaddc5c42ba505eda0a83a552ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qpgyz8mu9sl4xr7dqy2xxe5hpu4sazx6jg98uys",
+      "fundingPrivKey" : "92b2c8f9ae4bae329f3e81c4508e82ddd686d46b54d8126bc46e93ad35c3dfe5",
+      "payoutAddress" : "bcrt1qafap7ndjy5vjzyfpueammwnlz3msgydmvzempm"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105513393138383734313836363732373538343239350000000000000000142d32333434383538363139383035373030323138000000000bebc200133739333538323837363832313839393836343400000000090c382cfda712407005e5d943de7273f642a361c0ef8214992327691c5d3fe0e147d4be18dbb5a16089147cff2acb27bf18857f0ebd823e8e427361d70b31a472ad46ce59d4a1420258b432b32148ca47d1732dd4c9853381b3add4f833973a60f5764d8eb67da8e600160014eed7219c1201f5adf589ee589c8ced3fc3e8b89c0000000005f5e1000002fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001440c9a40b0e914695d6e7131be90a4f9ff9f76fd90000000000000000ffffffff006b0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91490824633ffc5774daca2bf05eb0dd9d803cf36fc870000000000000000ffffffff00da0022002015aca05dd68a3353331d24b3577f7de1c1f909bd80c2670268554f6680e965a8001600147e8adef42a98629bcbf099f707c24011a8b00708000000000000000500000064000000c8",
+  "accept" : "a71c8dc1aaf718829f8ea90f24dc8c30572e2af272d4ee5f069fde6f07e5e7c4c2bd0000000005f5e10003cb0e7ce1297f034f4be21a58509b17e171ddec012ad3e5562696d759564cbfd400160014ea7a1f4db22519211121e67bbdba7f14770411bb0002fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9148210f15e152dd2cce576ecbde816eb43bddb26e2870000000000000000ffffffff00da002200205b3100f743ad13354f6b54cd92b3ebc3f4080cc166cf3aa4d7c13773032de5aefda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020fe8178a237bbd5d4e8d2e80f127baf260cbf9387b690476ba8a8d20a668ae1560000000000000000ffffffff00da0000001600140a0823ef8587ea61f9a0228c6cd2e1e561d11b52fda716fd01e6001d6ed073e66d9b6becb158f1b0457e6988728f8806dddab3a437d22abbe331922b6b9c9b509895c07829375db2ae8b363bed6526c4704c3c6e9070b89163db8501f5882471c297ec410c9c3778c87a6a1f840f264a06a7099b0593f66be21770b0795518ab7d96a25522e39ce7b19334c30ec339b260f61d6d1c5389d7c3ae8e7d485c97a468a35a802c6cd2a72110131152ce0428600f425f36bf86337fc88ba201786c6145e4644c70ea24cd90355ec0e5d3ff2a9928ecca7437d50fce3d1009aad23cb7731c2e26347f748465d8d98ae74c0647abb342a041262b4a0f5916626a0045ea6eec1d2c4cdca05be4aa640c6eb3cfdc2f964dbaa335fc35173164385d4996ae12567222ad450484abb2fafe1b59f18d7f3d7e30d0a4ed2e858f4d416aa30fbe5c95255214e7dcb177427f577b06d99750188d0ea8282b6efecc51d8efa10022cb127e6592bbbe7ea24eebaa414ed33cda5546e4e8005b9f16d5123818d10a35edf98e80eba33bf52ac29481fdf5ed268dbdc0bf69db6ea82103d75f3e19aa0099404583edd3fed26bb53a80ff99c060684a860d3023fd0951cc8cf951cd87948e4d32d2d3691155d19857b587a2ff0be54745053bdf0304d0e52a85f18e064d92e276469114ba3675c4377ef8741df0c49c13f6ed97986a38a39ac9f3eafe5d1dfeaa1c8eac36cd60a28b60c9aa34bac47ee83d60cb0c624fa790089bd30fa463ea3044e2173af50029ecf0fb4421bc68c11bb77da12cad5791551d9d563a89",
+  "sign" : "a71e9e800fd760cbf2223718eb2ee7dbe76c0057ac1a6c88f5e95c0a03d60e54afebfda716fd01e6018902342bd5b89f4ed0e985d328cc6ca9866c70614e43f06b8d1f18a9c924d1046a3527754133c3b9d07849328d7b065557126b496066e5f35446b310c89519d801d6008b65fb10fc0cc25af57c6153e3908898dc1401428429493e774b975c4be085e6a597bc0f45f79e7d16aeb0971b6b003334fe7854606fca7c83122a7608bd26bf3b34682a4b21a7c0375465b32aa27e64d246c499590bd83e542399c648e400210bd759d212fc77c5f76c592ab03990127e781b3292da8f01623f6e1d367f72e9777ad3f816d879d756f0b370e4db048a12810926b67fd25075b8011fea99a000b7dbcf2c8e9b0ca37cf69dd0bc1eaaeab4d42089df513be249b2d3dd45273b870ebaf0ebcd818587e55ddba2e07d6784df94b9a18fc8601b27cc4a4b0a2855318ceb59b7d4593559f121a6a69a9de7c5cee6010c584035837ca95884f07eeb0f01e137705c7eff32d3a37578c4bbf631f86ad71c0b4e9b7fce5c6d071079c9b5457cd7f2ec7a8f576e7115ac11218082e0a3f38f8515098ed09e7d0b7507a46c0701160d5733a3fc549aaefe0d158b9b85a36c180dc35dbd58eb1f4c70b840fdac51feb91d77c984656d5a4ee63be68fd099d46dfc6068a7d2cd814a404c3e34687998c7a576b1915952b2f7b1c181f8cb13ca6102fcc80d3d013336ca2a3cfdfe85388f90a96ea57468c41fc50732f584b0338ab7c23392ebbd6384ae975cc0498d6e60910e99a68e623db7261096d0bb35a0e559d96f89decc5566927e64934d4cfda718fd014f0002000200473044022020ab4562bd34b0282c249627ecf8a38dbfd444799574e700adeed66e42d2fef50220718db59bbaea2733b928d7ab3cc92e7def1b5c8279c0cc3c2b45f8c20666c96a010021032eb8c36c51d6dbc83f1bf3619973e1b2f886773d0e02bbdc4c8b779ec2dd2b16000400000047304402204384ad6a1563b86ef62da9310afe16b0f49eb0614437209db6bcfd9fbee5d1a8022003ce41ae78bf9750a400d11a1ffe44181d52cadc3accc170444e71425444efcd0100473044022073bbd46b82498096466bb74df8c011905446921c3e1ee0a542f5d700385a374802203931622816b2b60898e56379e304b35abada7044d40ed5abc21d5057439a3c8e010047522102b184ce899ce1a69bdb28dbee027a5686f9ea9a46ef5a1c603b2780787fc2d8a3210271e413a805f92aefc7dd9e2ed0e7f37832b8174fffa928879a8b86f506495f1f52ae",
+  "unsignedTxs" : {
+    "fundingTx" : "02000000047940a0cd2ba2bb5e2a34d8cc2b1be7889795150f86d7f6acb533e974296138d90000000000ffffffff15e1685ec1ff1907572c6045b146a88b2fc6343652b91b52d4ffff6e33b1403b000000002322002015aca05dd68a3353331d24b3577f7de1c1f909bd80c2670268554f6680e965a8ffffffffb5bfb23bd7cee92f98e0f42673dbb63467473041ea7f1436b400f06023f3ea3c00000000232200205b3100f743ad13354f6b54cd92b3ebc3f4080cc166cf3aa4d7c13773032de5aeffffffff3c5f7f0522f255652499b08abf78d0347148dbca89c512243b1fba958cce7a990000000000ffffffff0352c5eb0b0000000022002085ca802f285aa2be13b441aca80ee1325bfe05bba5372b9231ba9beabd8580ed579ce111000000001600147e8adef42a98629bcbf099f707c24011a8b00708cb9be111000000001600140a0823ef8587ea61f9a0228c6cd2e1e561d11b5200000000",
+    "cets" : [ "02000000000101566d90e93304658276f3d782cedea52a42b0eb6bf2cf179eac6d497820a541130000000000feffffff0100c2eb0b00000000160014ea7a1f4db22519211121e67bbdba7f14770411bb014752210258b432b32148ca47d1732dd4c9853381b3add4f833973a60f5764d8eb67da8e62103cb0e7ce1297f034f4be21a58509b17e171ddec012ad3e5562696d759564cbfd452ae64000000", "02000000000101566d90e93304658276f3d782cedea52a42b0eb6bf2cf179eac6d497820a541130000000000feffffff0100c2eb0b00000000160014eed7219c1201f5adf589ee589c8ced3fc3e8b89c014752210258b432b32148ca47d1732dd4c9853381b3add4f833973a60f5764d8eb67da8e62103cb0e7ce1297f034f4be21a58509b17e171ddec012ad3e5562696d759564cbfd452ae64000000", "02000000000101566d90e93304658276f3d782cedea52a42b0eb6bf2cf179eac6d497820a541130000000000feffffff022c380c0900000000160014eed7219c1201f5adf589ee589c8ced3fc3e8b89cd489df0200000000160014ea7a1f4db22519211121e67bbdba7f14770411bb014752210258b432b32148ca47d1732dd4c9853381b3add4f833973a60f5764d8eb67da8e62103cb0e7ce1297f034f4be21a58509b17e171ddec012ad3e5562696d759564cbfd452ae64000000" ],
+    "refundTx" : "02000000000101566d90e93304658276f3d782cedea52a42b0eb6bf2cf179eac6d497820a541130000000000feffffff0200e1f50500000000160014eed7219c1201f5adf589ee589c8ced3fc3e8b89c00e1f50500000000160014ea7a1f4db22519211121e67bbdba7f14770411bb014752210258b432b32148ca47d1732dd4c9853381b3add4f833973a60f5764d8eb67da8e62103cb0e7ce1297f034f4be21a58509b17e171ddec012ad3e5562696d759564cbfd452aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "020000000001047940a0cd2ba2bb5e2a34d8cc2b1be7889795150f86d7f6acb533e974296138d90000000000ffffffff15e1685ec1ff1907572c6045b146a88b2fc6343652b91b52d4ffff6e33b1403b000000002322002015aca05dd68a3353331d24b3577f7de1c1f909bd80c2670268554f6680e965a8ffffffffb5bfb23bd7cee92f98e0f42673dbb63467473041ea7f1436b400f06023f3ea3c00000000232200205b3100f743ad13354f6b54cd92b3ebc3f4080cc166cf3aa4d7c13773032de5aeffffffff3c5f7f0522f255652499b08abf78d0347148dbca89c512243b1fba958cce7a990000000000ffffffff0352c5eb0b0000000022002085ca802f285aa2be13b441aca80ee1325bfe05bba5372b9231ba9beabd8580ed579ce111000000001600147e8adef42a98629bcbf099f707c24011a8b00708cb9be111000000001600140a0823ef8587ea61f9a0228c6cd2e1e561d11b5202473044022020ab4562bd34b0282c249627ecf8a38dbfd444799574e700adeed66e42d2fef50220718db59bbaea2733b928d7ab3cc92e7def1b5c8279c0cc3c2b45f8c20666c96a0121032eb8c36c51d6dbc83f1bf3619973e1b2f886773d0e02bbdc4c8b779ec2dd2b16040047304402204384ad6a1563b86ef62da9310afe16b0f49eb0614437209db6bcfd9fbee5d1a8022003ce41ae78bf9750a400d11a1ffe44181d52cadc3accc170444e71425444efcd01473044022073bbd46b82498096466bb74df8c011905446921c3e1ee0a542f5d700385a374802203931622816b2b60898e56379e304b35abada7044d40ed5abc21d5057439a3c8e0147522102b184ce899ce1a69bdb28dbee027a5686f9ea9a46ef5a1c603b2780787fc2d8a3210271e413a805f92aefc7dd9e2ed0e7f37832b8174fffa928879a8b86f506495f1f52ae0400473044022054777cc51771ed83faa48fb24fabc64066f56ca938eec1ffcc623626722f1a0802201c31cb49f100aca86d721e15252c045bb77013f48e8657308da3d8f75a104e0601473044022052c6498f7f67907a7a3eaf7ada44632ba6bd8ede96503d94ebe3b9fc94b0f15502203ce308a44146af0f27e81e7632b57d4d40f6b679279740f36891d3edf63a4b8901475221029bcd6bd92d735dd55c6066b3c89c36a4cd8bd08881359e6701cb3c4e69bb0f1721023f953836ca0c12e1e9ae50761778d42d15673e43b6e58d067c7e2da053a26dcc52ae040047304402205e527d8cfabe8b340e06a750719bd66f0ebcbe64b0702c7c7b6a11848e4af5da0220150768f2a64149b7e8a0cb42ba68564c7ceaeda07e8a3035caf501ae2e77e057014730440220420b8a3115cfbf9d279bc97c172a3c9de82534a11b41dde85c0b698423aa13ee022061b3e6a88c7835f457652fa2e71e835fdc238d82c8082d26d3ab49ca32ca97db0147522103653720f9b425948c3b694df791a8dba60de7252aa2b4f09411fcb9155ff0d017210345b5e430839a7dbc87c38ba0ff54b2104200550bfeaddc5c42ba505eda0a83a552ae00000000",
+    "cets" : [ "02000000000101566d90e93304658276f3d782cedea52a42b0eb6bf2cf179eac6d497820a541130000000000feffffff0100c2eb0b00000000160014eed7219c1201f5adf589ee589c8ced3fc3e8b89c040047304402200fcce3960f34bc4ec3530935662a68fa1a78aff0d8cc86bf45f903074b4413b0022044940c9de44283eeedd697922c53b6d1b308d2b8f6c0071455b66615937289fc014730440220786c6145e4644c70ea24cd90355ec0e5d3ff2a9928ecca7437d50fce3d1009aa022049490e518a961696d1af32aae3934d677c63ae6516dca85832c4953e9ea415f5014752210258b432b32148ca47d1732dd4c9853381b3add4f833973a60f5764d8eb67da8e62103cb0e7ce1297f034f4be21a58509b17e171ddec012ad3e5562696d759564cbfd452ae64000000", "02000000000101566d90e93304658276f3d782cedea52a42b0eb6bf2cf179eac6d497820a541130000000000feffffff0100c2eb0b00000000160014eed7219c1201f5adf589ee589c8ced3fc3e8b89c04004730440220210bd759d212fc77c5f76c592ab03990127e781b3292da8f01623f6e1d367f7202203e09e3ec8c995475bcdee3f4736be8610bca68b87ee092304facc72c421f12df01473044022000965a683b9151beabfcc46cb0c2e8f4d2dda55b7e6d9ab0d69429ef6473c47702203d9b6522cf99d0aed234971042dd836e7c442bc254f79e35be1e5a7b4aed503e014752210258b432b32148ca47d1732dd4c9853381b3add4f833973a60f5764d8eb67da8e62103cb0e7ce1297f034f4be21a58509b17e171ddec012ad3e5562696d759564cbfd452ae64000000" ],
+    "refundTx" : "02000000000101566d90e93304658276f3d782cedea52a42b0eb6bf2cf179eac6d497820a541130000000000feffffff0200e1f50500000000160014eed7219c1201f5adf589ee589c8ced3fc3e8b89c00e1f50500000000160014ea7a1f4db22519211121e67bbdba7f14770411bb04004730440220388f90a96ea57468c41fc50732f584b0338ab7c23392ebbd6384ae975cc0498d02206e60910e99a68e623db7261096d0bb35a0e559d96f89decc5566927e64934d4c0147304402201dfeaa1c8eac36cd60a28b60c9aa34bac47ee83d60cb0c624fa790089bd30fa4022063ea3044e2173af50029ecf0fb4421bc68c11bb77da12cad5791551d9d563a89014752210258b432b32148ca47d1732dd4c9853381b3add4f833973a60f5764d8eb67da8e62103cb0e7ce1297f034f4be21a58509b17e171ddec012ad3e5562696d759564cbfd452aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "7e239914c83530af6916fd073a432cf1bae2d047300e7f3124dbd72694517376",
+        "nonce" : "0105a1b367939db717a90a1f08cd12400fc5d9480c6681f057ddf81d43483925"
+      },
+      "contractInfo" : [ {
+        "preImage" : "7659527508679877682",
+        "outcome" : "68c4e2ec8c424d1159a527bc96f2595cd3d484d6755fdf1f33f925171b020fce",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-5604497920176127937",
+        "outcome" : "4da4cef1e2b6197a1d68e714211f0e5a9d56d4c3242104fcc08b294ede6a0a37",
+        "localPayout" : 147252211
+      }, {
+        "preImage" : "-6926421945853034085",
+        "outcome" : "babee8ddc36731eaaf5283e3f153d98a27ce2d4a27394ee840f4f832c01c991f",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "4da4cef1e2b6197a1d68e714211f0e5a9d56d4c3242104fcc08b294ede6a0a37",
+      "oracleSignature" : "0105a1b367939db717a90a1f08cd12400fc5d9480c6681f057ddf81d434839252ee6259a4b691fd3a19520d1012e16d5fd0f62fa89bd37791c13ff381d5da4f9"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9147139cbfd07e1ef3b361d6fe04c1c5f727e93592a8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "872ec5699b17a4aa08594038dde71bb7123faff8574e0501ce211f59ef458da1", "66728e62eafa951cca2a70286b59cfddfbcaae953e953d81164e4f24f30a196a" ],
+        "redeemScript" : "002020310a9c45c73b62a5cd25c2fc4f7f1af644451e3c3a4ee2c8dad084db254a2b",
+        "scriptWitness" : "014752210281555a59270ed1241e54d78fa55ba98140e1be75d4ba1c7569288846c35d38d521023d90bb4422aaac9eecb9d4d2c5c12aa630f4916bf02836f283535459fffa21ff52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e0efafb8e27fdbe704fdad1cd18fc069896a34dbc9f8fa4056b9e03c8a00307400000000",
+        "idx" : 0,
+        "inputKeys" : [ "95550204523ab59605bd275d7614114d15123f59661e5ee25a549b1f79cff3ff", "e335515cf994652835f7250a682ee960f56c7a00ae7928cb469826bb8f8f5a04" ],
+        "scriptWitness" : "014752210237d14e254cf5c6b187c78dc64698ecddacad4bf60ed00b73c753815ac7848e8021025566577cc4ad0d75d30faac0d9b0c652323a183f7579fb47c8d50df61e659f1552ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qgnx6vr9g5fz8src82dn54xwtwywc9x20d07x5h",
+      "fundingPrivKey" : "ff4f1bf3c79d740fd5c83b2c400b0919b60e3e424712ae35ea1ad44bb5e4be37",
+      "payoutAddress" : "bcrt1qthrnyx744m3xq50sclnn3zcjfsnuu8l562ka2w"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ecb157cbcd73b13bf978e37e3f2e8fca51269476dc031299f2c1bdd7e999fccd00000000",
+        "idx" : 0,
+        "inputKeys" : [ "0773b8fff74466bf9a942d3e091bfe83aa76d4742715f19b053cf8e12283fc5e", "4b0874dd18659ad730d30fdbc0530911c063c4744653f624989adbe720e74979" ],
+        "scriptWitness" : "0147522102325a204c673f9322618dcb395de1daa36794c1f52a849b4f33c9716f857dec63210354f966366f0deeaca7bddd4e412865f8c490055f9e0149f65692982f2c6993bc52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014a47433102cf26869ad8305d62c753043134ef25400000000",
+        "idx" : 0,
+        "inputKeys" : [ "d360be2aad83991efcd88b04545e4722b46b9ae44b269a07758f0196ac45cb60" ],
+        "scriptWitness" : "02002103213fc57a88bf07ae65c2e90fc7f9c14a72c877e3f20af8c4d81c357a563f3672",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600141363f78e1c2704fe429f36a33141d9ff2956a38f00000000",
+        "idx" : 0,
+        "inputKeys" : [ "f526d29e063058c81558fe8bb286a9893b1f422a1e76b9f1ab6da6ac4b523b16" ],
+        "scriptWitness" : "020021024f870c447d82582f6cafe2cd3787dc8b600f8f8461b5f31f648472e2e52d2539",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e52ec0af6e5c633027f60015b816c19a1fca6b507bd7945f40e4c34f402ec3e500000000",
+        "idx" : 0,
+        "inputKeys" : [ "6f4b0a9cdf67e2cae3c5fe363adf57b4492b16e83e80c4d6a50e1e08a5faef81", "8fc71e45af5ca1a0d1521c458ca2e121754540937539af20382c15b21c104a6e" ],
+        "scriptWitness" : "0147522102f72ef37efce97324bb7fc6657c6817d925c7e3536a466e721350a60a55b9211e21027b3ec66b0fa7e14f3e4da0832225f42d9796ae0b3e970a94c0906c7f3be79df052ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b41dad3a83113d014f732d5dceb2bf3af977afad00000000",
+        "idx" : 0,
+        "inputKeys" : [ "1d0c5e9319cc92c161b0ea7b59cae35c05d875f48a17d5d598382596bee7f6be" ],
+        "scriptWitness" : "02002102b214bc231eb565f8de22388f02edc2a13914be3d53a7c9f73362e6d8b3492aee",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qr8du8a4zj7cmlra9p60ayqxpg9mq6mwwvvx74d",
+      "fundingPrivKey" : "ada2ad98decfd1c35ab5415f70bec2f5a297ae7cac97a23bf1cea2af632a5cd1",
+      "payoutAddress" : "bcrt1qcexwg0zgllyhpfd5jef4n89cztg8hlthkpuzjz"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710561337363539353237353038363739383737363832000000000bebc200142d353630343439373932303137363132373933370000000008c6e3f3142d363932363432313934353835333033343038350000000000000000fda712407e239914c83530af6916fd073a432cf1bae2d047300e7f3124dbd726945173760105a1b367939db717a90a1f08cd12400fc5d9480c6681f057ddf81d43483925028229a9a13961df681beee1721237c4d4bf2420312a8c344ea3517a82680b9f6f001600145dc7321bd5aee26051f0c7e7388b124c27ce1ff40000000005f5e1000002fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9147139cbfd07e1ef3b361d6fe04c1c5f727e93592a870000000000000000ffffffff00da0022002020310a9c45c73b62a5cd25c2fc4f7f1af644451e3c3a4ee2c8dad084db254a2bfda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e0efafb8e27fdbe704fdad1cd18fc069896a34dbc9f8fa4056b9e03c8a0030740000000000000000ffffffff00da00000016001444cda60ca8a244780f0753674a99cb711d82994f000000000000000500000064000000c8",
+  "accept" : "a71c664a2a3b22d63318081e07749b487843c638318106ad2b1cfae3d51e2fd55d130000000005f5e100025e8cf31a9777f60e0fc19eff959f4483e507e3220e978bd5bc0d328cbefcef3200160014c64ce43c48ffc970a5b49653599cb812d07bfd770005fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ecb157cbcd73b13bf978e37e3f2e8fca51269476dc031299f2c1bdd7e999fccd0000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014a47433102cf26869ad8305d62c753043134ef2540000000000000000ffffffff006b0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600141363f78e1c2704fe429f36a33141d9ff2956a38f0000000000000000ffffffff006b0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e52ec0af6e5c633027f60015b816c19a1fca6b507bd7945f40e4c34f402ec3e50000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b41dad3a83113d014f732d5dceb2bf3af977afad0000000000000000ffffffff006b00000016001419dbc3f6a297b1bf8fa50e9fd200c141760d6dcefda716fd01e6009c51a955b656482cc2c1256f28c089cda27328f1fcc836e3d94359e5f5a41c79c2d661063f8531d017b6c1b70f8e96f1531c498a0cf0afffaa6c8f6a803a92b901a05c145a18eb0098b0c99a1adfce7f0a68479d622d0d99b675d5baf9f332f291bb1b438cd74a6d9ff47c2b7291071131d0d281778f984b5e4de9f6f908e5a0896d465d671c19263a84e5019e5b181e95bfed6daddaa71f6145a0223c5f51298d01697bd209665176e78cfeb2e80489c283465ee26f9b19c93da429401a9229b3fe59aefc1b33c4abcaab49baa4958e92e47c494fdee00786db0ab65825d4f8ed4d01e1cf73e6c5d3c3bcfeb81e28bbf4fcc5051a0d529d1556d20d349534f7e13c705b99234fec120836b298f8dff66cd89ca9405a3e9bfac64556c5a80fc91a7bdd0bd6303316cab10dd63290493fe6963cc1519654747d7099e647bb08656ccde601deb9333049da29090ddf74b1801502d1dadcf943cfc140417ec3a9f47f0be6c22fa3dffcb1f95c2ff3bf03546c2f39265f98af54666714f12cfbb11a23c8b90e00890cbf57544d73dda68110bee17fe738d630c28d8b03026c62d8e27e2d10bb16d9563fc629bd211817d131143d7c888eb8e994aee1535edb25914f2e1b2e5200b3e38f3fde1fb579666c26abde9483c867d227bd5e219938c8c821ff67292a3453d8f8d85550d609d6e52908bf2038c5a0d5cfdc6487e58aa67943a7ced44e0a0c509110d8543909bf64bcbaada843d741316c758149816cdb128bf2e49fccbf",
+  "sign" : "a71ed2cd9f7053a8048265c5dc6ef1e46298a01dc19e82ce02005698c42d7be43eaafda716fd01e601e32f796800757f29005f866b3312bcde96bbcc4dc0970be3db4cc2d5db5ba588fc38374ef1a888488612e5b94443d15085a424213cebea1d27201b8634be197201432f9b371fcc4ab5802bddc7c78253801e051c87c75cfc04691b1261d7117e81f08ac9e3df5d6836786afb4c66393972d308a1ea8ccf5851128a4abe59b20ccf6d1ba82bddfd4005a5941c18581d65670847dcc9685105e10bebdf39273745e8001ba603274c501aae0c6d0261339cae399f680e01e57a7a27d741907bfb82453d37ba76b74af3e052afc6c1ae811c2f88d5329f7ea59d534914773f8f0c0c9fe70121dc194734721f7ce24f3a664135b203696f10d9a36facc1b94cc1831f5424babde373ad6f7c50b3b2c67ddccaddde539dc5a40977936d35977ad39ccf34c7e7b9282fc079712b421941daf2d2ca68d3675d4cd34983d68d411b4db80952ef2e019d4e20b15f8aeacf5bff45cfa10aca52a09cf472dea899516be78262cbe4b1c86144a7bd05e1a1ef80b25c01ce1e4fa1db1e8d1a98a21d64c35c02c6ee81e29000067e650cc92041ffc747cebc5e300d6f15739ebaf6da299e47e8585c4eb57e82a388de2443131bab242265b0990440f152718e76486c3a73f1e27a1a3494e82bbd3c59a88e888c9280ee4854893d8f54e9a9e6b8ed39b06b72c5091fb6a429df5e99d760996578157338f169a4de0a9400d32823bb0f3470f0c5a509bffbd360283d6499a9098d862f0c44407b63f5aadc8628c15c656546b5bb4a7b8f96cdeefda718fd01c00002000400000047304402205944f39030cfbce8d32e3dca3b486b4263cede27909ba8a69d9e76d0e9e4604c0220263196e1dcb597df9c887e208313c50cba4b5a54f2bd672eb9fcad342738e4fd010047304402202aa43da0bf9828369fc3e8c6ab4f8a1f661a61d73f5f50e2b522e1040df018a80220134b25861f27df7453adad01208c84ca6be27d3dc9da85f15b721b2560ada79901004752210281555a59270ed1241e54d78fa55ba98140e1be75d4ba1c7569288846c35d38d521023d90bb4422aaac9eecb9d4d2c5c12aa630f4916bf02836f283535459fffa21ff52ae000400000047304402202494a9531263c6fa57368228875491ee7ff38716e6549c88fcbf7408fd6d467a02204cf75e88fa13ac8d487310b18cadaf752df1a8d13eea001046eac6972ec5966a01004730440220450f451a9e9a14ce5c542f653ebf344e53dadd7e53761320bb1ca23ffb96a38702201d7b28d9d7c1fdda63f2360d765646669ae963c12e860d96286d0172498d347901004752210237d14e254cf5c6b187c78dc64698ecddacad4bf60ed00b73c753815ac7848e8021025566577cc4ad0d75d30faac0d9b0c652323a183f7579fb47c8d50df61e659f1552ae",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000007f9d97c5023c4272bab0356360b568b23c40816d79a53e0a2065270fe6a25fcb8000000002322002020310a9c45c73b62a5cd25c2fc4f7f1af644451e3c3a4ee2c8dad084db254a2bffffffff4c7e75e282551dedcc120cfaabb8a13b9d188bc39467950bda1bc84b620b429d0000000000fffffffffa36d64732a7e6ce58639f5f5537f465cd86208fca8f171c9f3ca5f9d391537e0000000000ffffffff52cefa23b0e96138d9e8591cf11ee51855381a4739e6dfb26de68e5be1033c6f0000000000ffffffff542301393b389ba4ab03491f4518a4aa123b568a6a0a57ba94dfb5878400add00000000000ffffffffddda371eeaf4dcadc4c21b051f15c4d0707d4ac6c7482ea0d9abc8d4bc70ae4c0000000000ffffffffdd65b4c8e3b9e616aa3dba61e2688d455aaad9acde424ee35a5a352b9ed6b0430000000000ffffffff0352c5eb0b00000000220020173593dfc251714cc28fac7eb08b8bfcc84aa1b5c32170e5f3cfe3866c8a48a1cb9be1110000000016001444cda60ca8a244780f0753674a99cb711d82994f83dea4350000000016001419dbc3f6a297b1bf8fa50e9fd200c141760d6dce00000000",
+    "cets" : [ "02000000000101b963315433117bac1c2963841ff02566db1aac6a1adbdb6d9a377e714bb587b40000000000feffffff0100c2eb0b000000001600145dc7321bd5aee26051f0c7e7388b124c27ce1ff401475221025e8cf31a9777f60e0fc19eff959f4483e507e3220e978bd5bc0d328cbefcef3221028229a9a13961df681beee1721237c4d4bf2420312a8c344ea3517a82680b9f6f52ae64000000", "02000000000101b963315433117bac1c2963841ff02566db1aac6a1adbdb6d9a377e714bb587b40000000000feffffff02f3e3c608000000001600145dc7321bd5aee26051f0c7e7388b124c27ce1ff40dde240300000000160014c64ce43c48ffc970a5b49653599cb812d07bfd7701475221025e8cf31a9777f60e0fc19eff959f4483e507e3220e978bd5bc0d328cbefcef3221028229a9a13961df681beee1721237c4d4bf2420312a8c344ea3517a82680b9f6f52ae64000000", "02000000000101b963315433117bac1c2963841ff02566db1aac6a1adbdb6d9a377e714bb587b40000000000feffffff0100c2eb0b00000000160014c64ce43c48ffc970a5b49653599cb812d07bfd7701475221025e8cf31a9777f60e0fc19eff959f4483e507e3220e978bd5bc0d328cbefcef3221028229a9a13961df681beee1721237c4d4bf2420312a8c344ea3517a82680b9f6f52ae64000000" ],
+    "refundTx" : "02000000000101b963315433117bac1c2963841ff02566db1aac6a1adbdb6d9a377e714bb587b40000000000feffffff0200e1f505000000001600145dc7321bd5aee26051f0c7e7388b124c27ce1ff400e1f50500000000160014c64ce43c48ffc970a5b49653599cb812d07bfd7701475221025e8cf31a9777f60e0fc19eff959f4483e507e3220e978bd5bc0d328cbefcef3221028229a9a13961df681beee1721237c4d4bf2420312a8c344ea3517a82680b9f6f52aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000107f9d97c5023c4272bab0356360b568b23c40816d79a53e0a2065270fe6a25fcb8000000002322002020310a9c45c73b62a5cd25c2fc4f7f1af644451e3c3a4ee2c8dad084db254a2bffffffff4c7e75e282551dedcc120cfaabb8a13b9d188bc39467950bda1bc84b620b429d0000000000fffffffffa36d64732a7e6ce58639f5f5537f465cd86208fca8f171c9f3ca5f9d391537e0000000000ffffffff52cefa23b0e96138d9e8591cf11ee51855381a4739e6dfb26de68e5be1033c6f0000000000ffffffff542301393b389ba4ab03491f4518a4aa123b568a6a0a57ba94dfb5878400add00000000000ffffffffddda371eeaf4dcadc4c21b051f15c4d0707d4ac6c7482ea0d9abc8d4bc70ae4c0000000000ffffffffdd65b4c8e3b9e616aa3dba61e2688d455aaad9acde424ee35a5a352b9ed6b0430000000000ffffffff0352c5eb0b00000000220020173593dfc251714cc28fac7eb08b8bfcc84aa1b5c32170e5f3cfe3866c8a48a1cb9be1110000000016001444cda60ca8a244780f0753674a99cb711d82994f83dea4350000000016001419dbc3f6a297b1bf8fa50e9fd200c141760d6dce040047304402205944f39030cfbce8d32e3dca3b486b4263cede27909ba8a69d9e76d0e9e4604c0220263196e1dcb597df9c887e208313c50cba4b5a54f2bd672eb9fcad342738e4fd0147304402202aa43da0bf9828369fc3e8c6ab4f8a1f661a61d73f5f50e2b522e1040df018a80220134b25861f27df7453adad01208c84ca6be27d3dc9da85f15b721b2560ada799014752210281555a59270ed1241e54d78fa55ba98140e1be75d4ba1c7569288846c35d38d521023d90bb4422aaac9eecb9d4d2c5c12aa630f4916bf02836f283535459fffa21ff52ae040047304402202494a9531263c6fa57368228875491ee7ff38716e6549c88fcbf7408fd6d467a02204cf75e88fa13ac8d487310b18cadaf752df1a8d13eea001046eac6972ec5966a014730440220450f451a9e9a14ce5c542f653ebf344e53dadd7e53761320bb1ca23ffb96a38702201d7b28d9d7c1fdda63f2360d765646669ae963c12e860d96286d0172498d3479014752210237d14e254cf5c6b187c78dc64698ecddacad4bf60ed00b73c753815ac7848e8021025566577cc4ad0d75d30faac0d9b0c652323a183f7579fb47c8d50df61e659f1552ae0400473044022015a5cb2cce607fbd4c65a3650f65ed4a782beac031add61beecbaa9d74871ade0220336fba4397fb7322582b0bce52b5cb4bc1da081d55399432a83e4399c89320060147304402204cf2f483d3d8cbb2a9f7391c802ff0fb26fbdac9bc4b4d589aeb03da6cba46cc0220170755759e51b84f2e58d7456ff60e280a83bc9c05f5e9ffbd89225c181f8f760147522102325a204c673f9322618dcb395de1daa36794c1f52a849b4f33c9716f857dec63210354f966366f0deeaca7bddd4e412865f8c490055f9e0149f65692982f2c6993bc52ae02473044022021b21f276db7ef53e968525eac3956753dd583b9f9e5d5f1f3ec2014aacb6623022065e41b368431548703d122c8501755133cd791db691a151958bca0f7205ea7aa012103213fc57a88bf07ae65c2e90fc7f9c14a72c877e3f20af8c4d81c357a563f36720247304402201054f1e31f0aa94c6df4634e165f61943c9616a4d798c6221a4dde27a1c5e2ab02206d87481100cbbfe2e2b3128bd752eaff546e4f0d857aa5ab27fcdd4e013353390121024f870c447d82582f6cafe2cd3787dc8b600f8f8461b5f31f648472e2e52d2539040047304402200240ae9fbd1e60f7bd428a2debcff1ecaf92c39df989d73a3933044a4490b77a022075cebe872b22311886f27ddfaaf7bc3b33e4d90d657fba5df0782ce51b0912f8014730440220447d1cb6ddf045e10200a85e65c271a0e1d06f991e839fd8eba5f5fa2c57417502201e934f6f32209dd6d8ded1ee42437fe805160ae15bc531915ffd37521e7c8e2e0147522102f72ef37efce97324bb7fc6657c6817d925c7e3536a466e721350a60a55b9211e21027b3ec66b0fa7e14f3e4da0832225f42d9796ae0b3e970a94c0906c7f3be79df052ae024730440220625ace4b47bc1ae653b796d8ab72166cfba4de6e2d24b6a37533e4df1921366202201cf69ac9a479414877b7aa01956a1ae47b5b0198565e4f59b419748ce9a9dee8012102b214bc231eb565f8de22388f02edc2a13914be3d53a7c9f73362e6d8b3492aee00000000",
+    "cets" : [ "02000000000101b963315433117bac1c2963841ff02566db1aac6a1adbdb6d9a377e714bb587b40000000000feffffff02f3e3c608000000001600145dc7321bd5aee26051f0c7e7388b124c27ce1ff40dde240300000000160014c64ce43c48ffc970a5b49653599cb812d07bfd7704004730440220697bd209665176e78cfeb2e80489c283465ee26f9b19c93da429401a9229b3fe02200329137d904b6e42428ce2f1893863eb73b13e7f7f2757e8bfe2a009aa23e32e014730440220477427f3affd09c2326c4e5de3ac535bda0e7a224ae24aa374e532a6dc3104f6022056bbeed5f1a65c324e3775951cdd69116000e280df48750b0abc8db782f8d28401475221025e8cf31a9777f60e0fc19eff959f4483e507e3220e978bd5bc0d328cbefcef3221028229a9a13961df681beee1721237c4d4bf2420312a8c344ea3517a82680b9f6f52ae64000000", "02000000000101b963315433117bac1c2963841ff02566db1aac6a1adbdb6d9a377e714bb587b40000000000feffffff02f3e3c608000000001600145dc7321bd5aee26051f0c7e7388b124c27ce1ff40dde240300000000160014c64ce43c48ffc970a5b49653599cb812d07bfd77040047304402207fe6cf9744888edfd6f83e3aff0fbb96fd7f6a01f108d67409fc4b94fd5c91a802202a6b6766c7e2f2bc97aba0b1fcbc240fb76ca821d69a95de3948d22c9048db170147304402201ba603274c501aae0c6d0261339cae399f680e01e57a7a27d741907bfb82453d0220427dcc694c8680248ab0dc3db7bfd9d8e0f5c5b3b5a0a3e47ce735cb52833a1501475221025e8cf31a9777f60e0fc19eff959f4483e507e3220e978bd5bc0d328cbefcef3221028229a9a13961df681beee1721237c4d4bf2420312a8c344ea3517a82680b9f6f52ae64000000" ],
+    "refundTx" : "02000000000101b963315433117bac1c2963841ff02566db1aac6a1adbdb6d9a377e714bb587b40000000000feffffff0200e1f505000000001600145dc7321bd5aee26051f0c7e7388b124c27ce1ff400e1f50500000000160014c64ce43c48ffc970a5b49653599cb812d07bfd770400473044022053d8f8d85550d609d6e52908bf2038c5a0d5cfdc6487e58aa67943a7ced44e0a02200c509110d8543909bf64bcbaada843d741316c758149816cdb128bf2e49fccbf0147304402205e99d760996578157338f169a4de0a9400d32823bb0f3470f0c5a509bffbd3600220283d6499a9098d862f0c44407b63f5aadc8628c15c656546b5bb4a7b8f96cdee01475221025e8cf31a9777f60e0fc19eff959f4483e507e3220e978bd5bc0d328cbefcef3221028229a9a13961df681beee1721237c4d4bf2420312a8c344ea3517a82680b9f6f52aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "013ede2f688c9b41563c4dd98ea9ce4fe5ad7a579926c6ca57d689be37c0219f",
+        "nonce" : "585a50d5df87682b406d1fd3c7dc73b46c7f172eb079a40f010a8499c35ae5a5"
+      },
+      "contractInfo" : [ {
+        "preImage" : "8737784084827002256",
+        "outcome" : "bce71f909e44c897c0c9d4ece6aed44ffaeac81467a393a2ba0f91137a4719c7",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-1834805773681254256",
+        "outcome" : "bad5bd033431bdeff452099da4d38a3c727484322858ae70204ee6d1a7bab6ab",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-648039517826976112",
+        "outcome" : "9c82ea78d97a885a230655fe79ea2b66c114ff2830d02d1de2c51a265d22acd3",
+        "localPayout" : 91792879
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "bad5bd033431bdeff452099da4d38a3c727484322858ae70204ee6d1a7bab6ab",
+      "oracleSignature" : "585a50d5df87682b406d1fd3c7dc73b46c7f172eb079a40f010a8499c35ae5a5c3c5f48e9370c2f1863f7c79f1b8a3a1a14efb889751f9cbfc885b6254cede9c"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200206a8110d3bff15753b550f17d080580b28e82e07dc423deda30359280f33b469900000000",
+        "idx" : 0,
+        "inputKeys" : [ "87858dce015cced2fa380dd693fc592657c85ba172ec8958523474a1cdea365f", "9b3b064f471c37887c012a448b9585fbfcac1beb01e7eea97cf9309cae0b7bfd" ],
+        "scriptWitness" : "0147522103bcdfd76188b823a3553ebeeda6d7920065fc2440d0fd71b571ef30db46942ca62103d6a096873ade34aadbb97a4c76d1720957e2bd46497a0002b48dadf06294e19852ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002046411f897e218dfe59129ea3309d9911562e96b66acdb1d1dd02e8689b09aeb700000000",
+        "idx" : 0,
+        "inputKeys" : [ "d08a80581ae95494334ab3a94cbf4aa421057e42989fd9a4cd056654b542580e", "83b1e5cff5e37c5d9d172292926e2bb03279ea31f1ff48f319c8aaedda3e9d4c" ],
+        "scriptWitness" : "0147522102bbe66c4d81ddfa54f41186c78546049846f7bf5b23dbe15ffaf8c3908376c5ba2102e5b272dd5daf05c842c14d2a6b42da5238f5c4c1e7ce2886128ca153fdcf230f52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020111b9dcf3235dc483613f7100cec80a2886e2b2add2fe0c1b0847ab8e08c2d5200000000",
+        "idx" : 0,
+        "inputKeys" : [ "43767829dd550922fc74b8ad496b1ac62cd003e3f3c7bb58ffa601dc60fdeb7f", "e049e467b0b455a0ffe910ad28309ffd21e70193ab27e3574ebce814629ea56d" ],
+        "scriptWitness" : "0147522103821d80c679002f61236052329f0bb4388a17ba9f7fe1191fd78385015c5a6ff5210352e786ba081b7cb1b3e8d45922d6c90e9a05e619111bfec69821d7f94f2d82db52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91484520e16b84e5e96925d067946b1341483c0a3a08700000000",
+        "idx" : 0,
+        "inputKeys" : [ "aea83673a9fdd803867fab7ee4096d4090f0a8453ebcd4a12bde5d432a87773e", "ded32e744a28ef19c111dc7630ff2cb85fb73806b2245b7a3a99a14af8bb83eb" ],
+        "redeemScript" : "00205763c5f6461f11fa35223a5ac1d074ec76cb18464dded2a39ce410b3ab941c3a",
+        "scriptWitness" : "0147522102feeb047a638baccfceffdd734c5129fd229d104ac536ca5080a16856f837c6542102d405837e52e18c42778a58fcd0a84c7a14b8ff0336f865a81c2d151ac259408752ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914bbfcc9d76ef8009406aa880f003911542956909d8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "04c3056e6ccaf00efe4500ba298954d3a00a4e278ce1cb3ba1b010a3771f2925", "874bac1ab7f56860681aedcd64dc9a48964a5d016ade918e17ea1419817a4b94" ],
+        "redeemScript" : "0020dc9d6c70123644fb7da867fae7e5925a4b5a12220840a2fc29033ed7380d9e06",
+        "scriptWitness" : "01475221023631c0bf051d3580a71996564a5e73cee76f2bbbcf5643b94b04ab55117aa1c821039906586a4241a603fb3cbe9beef2d76fdb6c56bc271bb92552650fc001cc5c4452ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qcjxf0sj5z953eatssv698vr6qd0vfc2q9hu7k0",
+      "fundingPrivKey" : "8f85e7148e677201fa698dfa5447e298e5c8283625279acfb1a671f7bd15cfc9",
+      "payoutAddress" : "bcrt1qcq4ay2edzqu6qewk83mtc9c4sec93fy49fztkw"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9147c37e1d9de3357efba2a666ae1ce2f3b68a9664f8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "a2c93cbc81e0ad2df5e8fd99fd82162d4afbdcfdabbb9a8c94f6f95b5a146806", "a711558a85b0e1b2a22d6c9569cec79ec37056a92f98fb0100d393f45c83388a" ],
+        "redeemScript" : "0020d1b534b6692385c12d793a5b554ad6c72cc3bcc4ee0f5d7171af5a6d0e813b73",
+        "scriptWitness" : "0147522103cfe2e702a77a60b4a382c6fd2a93eef1139fc21099a7c1a4f68f48c73dd9743b210248ea135afe7aef3ce155793746f9aee541549438695907f636c157d040cbf8a652ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qdtu7yx9rh4ded3f7d9jmfpkaek9tcrqdtpd9ae",
+      "fundingPrivKey" : "fe60fa47f7340652694a891eb26ab92644611ff4ee49936a26866b96b542ba4e",
+      "payoutAddress" : "bcrt1qg4m6yjxm5kmktd7whwgp6uewyk60r3v2g9pa44"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710551338373337373834303834383237303032323536000000000bebc200142d313833343830353737333638313235343235360000000000000000132d363438303339353137383236393736313132000000000578a5effda71240013ede2f688c9b41563c4dd98ea9ce4fe5ad7a579926c6ca57d689be37c0219f585a50d5df87682b406d1fd3c7dc73b46c7f172eb079a40f010a8499c35ae5a50316b1f2cf8f672401e2ff89a65b7dd185c93c485deeb4085d70c187f9b5ac43d400160014c02bd22b2d1039a065d63c76bc1715867058a4950000000005f5e1000005fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200206a8110d3bff15753b550f17d080580b28e82e07dc423deda30359280f33b46990000000000000000ffffffff00da0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002046411f897e218dfe59129ea3309d9911562e96b66acdb1d1dd02e8689b09aeb70000000000000000ffffffff00da0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020111b9dcf3235dc483613f7100cec80a2886e2b2add2fe0c1b0847ab8e08c2d520000000000000000ffffffff00da0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91484520e16b84e5e96925d067946b1341483c0a3a0870000000000000000ffffffff00da002200205763c5f6461f11fa35223a5ac1d074ec76cb18464dded2a39ce410b3ab941c3afda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914bbfcc9d76ef8009406aa880f003911542956909d870000000000000000ffffffff00da00220020dc9d6c70123644fb7da867fae7e5925a4b5a12220840a2fc29033ed7380d9e0600160014c48c97c25411691cf570833453b07a035ec4e140000000000000000500000064000000c8",
+  "accept" : "a71c70e2bf338d612388c61a1253ddbafceb8b6fd73459d547ce3c03eb7ca698a34e0000000005f5e10002623965647c6a10136c4c1668e21bb9d34a11b1e2f6389031d8db6525c766e1b6001600144577a248dba5b765b7cebb901d732e25b4f1c58a0001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9147c37e1d9de3357efba2a666ae1ce2f3b68a9664f870000000000000000ffffffff00da00220020d1b534b6692385c12d793a5b554ad6c72cc3bcc4ee0f5d7171af5a6d0e813b73001600146af9e218a3bd5b96c53e6965b486ddcd8abc0c0dfda716fd01e60196966d1334b5d39f23115cbb1308810249e0d967f514575d57519c594457dee435847190b6f6e21029dc7c37cde10585ed487094f18ea133d26ec46df73b66f100088d53fca7fbf76dc1af0767f1643ac9daca6254252541044135dbba372976d68ab579f0d6b5c06ec220d612c293774c32bfd0c284dcb96e75b0b7f40e211e950e35890f2b1d3129cc238e9f40a29dc2b1d309473d74ad410c2b5f8bf986f702014c4225e1ba1ef6f58f0597d53cc0cf8ad71595c7de20db28f03fca7a3514a54689884b208d955dbe30c4f9eece15b9219ebf25ff148e434a54bf6cd07dfe84b20123ad9d4db18e893a1283324c7047637501b08711b925857cac48c8e7aff21dc9cd01cfd0107295f0cea48a81f9f47c7df4ba4cc8c74c48295b9920fa4f41a9bd537feee26e1adc13d339dea7ed4e419dd765bb5e82b3d41746db2701fca0073c01c1b637b45fc5be83ad57150406a5114770ad95b6eb71e4e13ea986ea14a67edc434d3f754e56805832033aa00004fe658df8b3053303e58152f455a63bdf1db1019a5352fe3a46d91740a18bbe6a02178976f6fc890e9148dc824b91c2c56c5623f30ca5fc314fd512f4e8553bb111f1b434b3c12bc97ca6c1d77b4e656bfa655e8d7de69fa89df6211af54f9951926f8dc9767a7a990c304d0ac23813ec3074945685b8a03ea20daf4402add7967b085078d79ccf03e012c0974019aa1da40ce444173f156e6f31c38fb0458eec6b164f386b2e6d13807ed22c2bf5b02d704a88",
+  "sign" : "a71e074c6ad8161f329189f04950d05b0459a9a91e44b66af30e063ead42e5d3cc7ffda716fd01e6018b82e3c8be3cbc1c945d304eba3853cca7932bcbdb31a59386e37d7d74d6b9c83ef608d0983f853ebe8a0e7309e53fc6f6361eaaf556fc0907318862d24e1c08002c403dc6f281f99db5cd9c270aa24e02b3b4d98699e8879ce0f662ff6bba124e597cdc03fac48c84309bb316606d6487e67ef1a6580fb7bd2b544c8d89501aa080ca5ab49e46e425a2dd286eb1b01f039a8002e08b7ed4d5d86b175bd830552901d1b4443afde7f016db010fd2c8cf488a8b433b23090809fbc91a915ad9bcd004f06638b90adf36657c88472d7e9185e48968e87b8d17163bd0d2c36ffa104424010cd1a56c136fc9080054e444844511c60fb18f7c42d316f7cbb6b468c09480306b060890a636e44eaca31e40d9397bf4be8d08c2dfb4985ddcc52ce1922c8873e651384c9293836d262c11782a442a93388127bfd547490be42b532ff882be9901867189d455eb8376093a4f6570486dd94e94f17b4371eb68c13ab0910ac0450873d19295ed2b1fd0eed8f746f4b0d11c6ce8672434c534bd4bd5d197fd1147660080fe1e23872c1ce67cf3d6df744d901ef0fe908b355752f172cba78b3833ef07b37898fadf44acf708a06d70d55f431c76d78319f4069eb2c44289656906167b9536032a23fdb95b2e276cea55ae2ab46ad209be876d7f5ed7fb734dff5b02fb0fd09dddab990d5ef9273b89cbd4e41724cd125ab53acc19cc789cb01864f3e140fb9758ad720509cf2413304be3462678763df1f025c442e9e76e711ffe8a59fda718fd045d0005000400000047304402205ef82f4225065963061e45768321d77af69689f40a17288af57c3bbf38610c0f02206d3d97df7c7a78adc67a7b818d413570e03d491bdc569178734c50460f30a67a010047304402203a177928a84b4bc6fd749810d61a33d13a8d7d840b61fe3a5f04f7236af7ba46022002f6c95214e6f2f5177609498faade2aab8ce22e3a44e0cb5e9ff9374575453c010047522103bcdfd76188b823a3553ebeeda6d7920065fc2440d0fd71b571ef30db46942ca62103d6a096873ade34aadbb97a4c76d1720957e2bd46497a0002b48dadf06294e19852ae000400000047304402206a116810270780201e99f89391d077b2f2bbb228d1538c7e58d0c3e31e34f777022069ba5bf68d2a0b3724a24a3bd3d8123fbb9141033b53a86a9401818b3683e8f6010047304402207da540cb8ee14c12e33480335abdaf2f40c78d32d4d6bd0cb25230b41e0764600220407dc666e364656aed3a03a05233cbb7443933e3a89944d393b8dc3a0e599e7d010047522102bbe66c4d81ddfa54f41186c78546049846f7bf5b23dbe15ffaf8c3908376c5ba2102e5b272dd5daf05c842c14d2a6b42da5238f5c4c1e7ce2886128ca153fdcf230f52ae00040000004730440220107afd0260926a7870655fe59bac8db9d47c930739f8bba7152bc1bdcb8caa7a02201840b796d93d025b4619d49797f5600a69f5c01108f8f47109f4fa7f7b6587b301004730440220612ef987c052fa5fe0d8ec79795ca4f9ab0cd5e34188dbc7dfec8b6755c1437f02204cbeb331e6cfb83934609eeabe0a5f14619efcbd09f99c6c70c6da9be1eb645a010047522103821d80c679002f61236052329f0bb4388a17ba9f7fe1191fd78385015c5a6ff5210352e786ba081b7cb1b3e8d45922d6c90e9a05e619111bfec69821d7f94f2d82db52ae00040000004730440220620e4539f38dde53a8e1b9dbb2afdea9418e016fa1443c88a92f4c33065d63250220355de85ac2150448b41466080be65e10830d72585f1bc0f944993c025a5dfe930100473044022011ddee2420ca3fda6c3b00ab42032370d1dba03beccada3d93579006b6e94c100220027f36f5fc39dd34fa03509679c7841fb45bc70b127fa65e75c0b6d5efbfe788010047522102feeb047a638baccfceffdd734c5129fd229d104ac536ca5080a16856f837c6542102d405837e52e18c42778a58fcd0a84c7a14b8ff0336f865a81c2d151ac259408752ae000400000047304402205dc6a5ff261279ce0517ef14432ec600c09f1c2aebf875a692e3996651a2b707022005a36a09e114fbff647565ef51f74b1f27b306029da3e815ecc1a88421fa65400100473044022062aa950cc7e19367efbc95696c0994c6b46b9299d8f38b9caa4f10cf34c63c31022054caf90a6b7480c857279fd75fcec062731248622038a765af498c0d915901a10100475221023631c0bf051d3580a71996564a5e73cee76f2bbbcf5643b94b04ab55117aa1c821039906586a4241a603fb3cbe9beef2d76fdb6c56bc271bb92552650fc001cc5c4452ae",
+  "unsignedTxs" : {
+    "fundingTx" : "020000000668e96e215df8f11e7507f414fd06cff2b3547f22e3f8d219939628a1cd220ee30000000000ffffffffbd86e993b72b99083082c10cbf01f2c311ba7d9c45968484ed9ee99696f811fb0000000000ffffffffff3e0eddf55a570d36d8cef1615cd74b5c0ba3ad0863a3500c0bd045847c9de70000000000ffffffffd3dd4e3c8d0ff201fd9cc04431923dc106058251bc2cb39c0d926059c8b37a2500000000232200205763c5f6461f11fa35223a5ac1d074ec76cb18464dded2a39ce410b3ab941c3affffffff7557ee0c8065e82dce5668edc5fc81eff37f97896007576ab308095fbe0f6b4c0000000023220020dc9d6c70123644fb7da867fae7e5925a4b5a12220840a2fc29033ed7380d9e06ffffffff8408f41b0cd0dcf3349f9e27625fee58a56d56a634d7d4902ce1f9ad2b4d12e60000000023220020d1b534b6692385c12d793a5b554ad6c72cc3bcc4ee0f5d7171af5a6d0e813b73ffffffff0352c5eb0b00000000220020acc8c4eb0d0be7d9e31c520d6f21f111f10f856c3a74e4a6ab42819d0c92c76881dba43500000000160014c48c97c25411691cf570833453b07a035ec4e140a6dbf505000000001600146af9e218a3bd5b96c53e6965b486ddcd8abc0c0d00000000",
+    "cets" : [ "02000000000101316f4b433e463d3ac0b4bfef70c9c622b2f8e10d035bea4f19117e9bebd5ae770000000000feffffff0100c2eb0b00000000160014c02bd22b2d1039a065d63c76bc1715867058a4950147522102623965647c6a10136c4c1668e21bb9d34a11b1e2f6389031d8db6525c766e1b6210316b1f2cf8f672401e2ff89a65b7dd185c93c485deeb4085d70c187f9b5ac43d452ae64000000", "02000000000101316f4b433e463d3ac0b4bfef70c9c622b2f8e10d035bea4f19117e9bebd5ae770000000000feffffff0100c2eb0b000000001600144577a248dba5b765b7cebb901d732e25b4f1c58a0147522102623965647c6a10136c4c1668e21bb9d34a11b1e2f6389031d8db6525c766e1b6210316b1f2cf8f672401e2ff89a65b7dd185c93c485deeb4085d70c187f9b5ac43d452ae64000000", "02000000000101316f4b433e463d3ac0b4bfef70c9c622b2f8e10d035bea4f19117e9bebd5ae770000000000feffffff02efa5780500000000160014c02bd22b2d1039a065d63c76bc1715867058a495111c7306000000001600144577a248dba5b765b7cebb901d732e25b4f1c58a0147522102623965647c6a10136c4c1668e21bb9d34a11b1e2f6389031d8db6525c766e1b6210316b1f2cf8f672401e2ff89a65b7dd185c93c485deeb4085d70c187f9b5ac43d452ae64000000" ],
+    "refundTx" : "02000000000101316f4b433e463d3ac0b4bfef70c9c622b2f8e10d035bea4f19117e9bebd5ae770000000000feffffff0200e1f50500000000160014c02bd22b2d1039a065d63c76bc1715867058a49500e1f505000000001600144577a248dba5b765b7cebb901d732e25b4f1c58a0147522102623965647c6a10136c4c1668e21bb9d34a11b1e2f6389031d8db6525c766e1b6210316b1f2cf8f672401e2ff89a65b7dd185c93c485deeb4085d70c187f9b5ac43d452aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "0200000000010668e96e215df8f11e7507f414fd06cff2b3547f22e3f8d219939628a1cd220ee30000000000ffffffffbd86e993b72b99083082c10cbf01f2c311ba7d9c45968484ed9ee99696f811fb0000000000ffffffffff3e0eddf55a570d36d8cef1615cd74b5c0ba3ad0863a3500c0bd045847c9de70000000000ffffffffd3dd4e3c8d0ff201fd9cc04431923dc106058251bc2cb39c0d926059c8b37a2500000000232200205763c5f6461f11fa35223a5ac1d074ec76cb18464dded2a39ce410b3ab941c3affffffff7557ee0c8065e82dce5668edc5fc81eff37f97896007576ab308095fbe0f6b4c0000000023220020dc9d6c70123644fb7da867fae7e5925a4b5a12220840a2fc29033ed7380d9e06ffffffff8408f41b0cd0dcf3349f9e27625fee58a56d56a634d7d4902ce1f9ad2b4d12e60000000023220020d1b534b6692385c12d793a5b554ad6c72cc3bcc4ee0f5d7171af5a6d0e813b73ffffffff0352c5eb0b00000000220020acc8c4eb0d0be7d9e31c520d6f21f111f10f856c3a74e4a6ab42819d0c92c76881dba43500000000160014c48c97c25411691cf570833453b07a035ec4e140a6dbf505000000001600146af9e218a3bd5b96c53e6965b486ddcd8abc0c0d040047304402205ef82f4225065963061e45768321d77af69689f40a17288af57c3bbf38610c0f02206d3d97df7c7a78adc67a7b818d413570e03d491bdc569178734c50460f30a67a0147304402203a177928a84b4bc6fd749810d61a33d13a8d7d840b61fe3a5f04f7236af7ba46022002f6c95214e6f2f5177609498faade2aab8ce22e3a44e0cb5e9ff9374575453c0147522103bcdfd76188b823a3553ebeeda6d7920065fc2440d0fd71b571ef30db46942ca62103d6a096873ade34aadbb97a4c76d1720957e2bd46497a0002b48dadf06294e19852ae040047304402206a116810270780201e99f89391d077b2f2bbb228d1538c7e58d0c3e31e34f777022069ba5bf68d2a0b3724a24a3bd3d8123fbb9141033b53a86a9401818b3683e8f60147304402207da540cb8ee14c12e33480335abdaf2f40c78d32d4d6bd0cb25230b41e0764600220407dc666e364656aed3a03a05233cbb7443933e3a89944d393b8dc3a0e599e7d0147522102bbe66c4d81ddfa54f41186c78546049846f7bf5b23dbe15ffaf8c3908376c5ba2102e5b272dd5daf05c842c14d2a6b42da5238f5c4c1e7ce2886128ca153fdcf230f52ae04004730440220107afd0260926a7870655fe59bac8db9d47c930739f8bba7152bc1bdcb8caa7a02201840b796d93d025b4619d49797f5600a69f5c01108f8f47109f4fa7f7b6587b3014730440220612ef987c052fa5fe0d8ec79795ca4f9ab0cd5e34188dbc7dfec8b6755c1437f02204cbeb331e6cfb83934609eeabe0a5f14619efcbd09f99c6c70c6da9be1eb645a0147522103821d80c679002f61236052329f0bb4388a17ba9f7fe1191fd78385015c5a6ff5210352e786ba081b7cb1b3e8d45922d6c90e9a05e619111bfec69821d7f94f2d82db52ae04004730440220620e4539f38dde53a8e1b9dbb2afdea9418e016fa1443c88a92f4c33065d63250220355de85ac2150448b41466080be65e10830d72585f1bc0f944993c025a5dfe9301473044022011ddee2420ca3fda6c3b00ab42032370d1dba03beccada3d93579006b6e94c100220027f36f5fc39dd34fa03509679c7841fb45bc70b127fa65e75c0b6d5efbfe7880147522102feeb047a638baccfceffdd734c5129fd229d104ac536ca5080a16856f837c6542102d405837e52e18c42778a58fcd0a84c7a14b8ff0336f865a81c2d151ac259408752ae040047304402205dc6a5ff261279ce0517ef14432ec600c09f1c2aebf875a692e3996651a2b707022005a36a09e114fbff647565ef51f74b1f27b306029da3e815ecc1a88421fa654001473044022062aa950cc7e19367efbc95696c0994c6b46b9299d8f38b9caa4f10cf34c63c31022054caf90a6b7480c857279fd75fcec062731248622038a765af498c0d915901a101475221023631c0bf051d3580a71996564a5e73cee76f2bbbcf5643b94b04ab55117aa1c821039906586a4241a603fb3cbe9beef2d76fdb6c56bc271bb92552650fc001cc5c4452ae040047304402200b7fac42fa4a58b71e3d025eed08bfd8b4c40b35727d63880f7694723b10614102203de0bceaf5e6b1c463abd22cf4368b3eb310c6c79688170fb5f190a2ebd37fd301473044022041cfc5ae48c0d96a90fe8a0eb2f60e07eb050309c5ced87fead2058a866833a502206e3a9abe6bc0bd87ae462ef087dfca026478ef6bce4ade59c824aa21e0e84e470147522103cfe2e702a77a60b4a382c6fd2a93eef1139fc21099a7c1a4f68f48c73dd9743b210248ea135afe7aef3ce155793746f9aee541549438695907f636c157d040cbf8a652ae00000000",
+    "cets" : [ "02000000000101316f4b433e463d3ac0b4bfef70c9c622b2f8e10d035bea4f19117e9bebd5ae770000000000feffffff0100c2eb0b000000001600144577a248dba5b765b7cebb901d732e25b4f1c58a040047304402204c4225e1ba1ef6f58f0597d53cc0cf8ad71595c7de20db28f03fca7a3514a54602201f004074618e55defc1ce4bda2526519afcecef8859d3240f27edfebaeafdbac0147304402207b743ab30bd3bb9ba7550797dd6eb9899f6b263f09e78c44142a1791dac8800502201f34036fa592e747827dcaf94ea57e752e9289e9cb2a0e4e412a9f813553acdc0147522102623965647c6a10136c4c1668e21bb9d34a11b1e2f6389031d8db6525c766e1b6210316b1f2cf8f672401e2ff89a65b7dd185c93c485deeb4085d70c187f9b5ac43d452ae64000000", "02000000000101316f4b433e463d3ac0b4bfef70c9c622b2f8e10d035bea4f19117e9bebd5ae770000000000feffffff0100c2eb0b000000001600144577a248dba5b765b7cebb901d732e25b4f1c58a040047304402201be22e24b2bf548f9e92a3ce3b6426d0e5dbab69f4a64115549cf0cd9df9feef02204ca0b59b59a45a19ca37b9427c71f99e0981ff29c609b78615912bfc614743db01483045022100d1b4443afde7f016db010fd2c8cf488a8b433b23090809fbc91a915ad9bcd00402207b97d3523c6e91d71ef3c734ae2075995832f86b2eaf7c306a0ffca6ef6e651f0147522102623965647c6a10136c4c1668e21bb9d34a11b1e2f6389031d8db6525c766e1b6210316b1f2cf8f672401e2ff89a65b7dd185c93c485deeb4085d70c187f9b5ac43d452ae64000000" ],
+    "refundTx" : "02000000000101316f4b433e463d3ac0b4bfef70c9c622b2f8e10d035bea4f19117e9bebd5ae770000000000feffffff0200e1f50500000000160014c02bd22b2d1039a065d63c76bc1715867058a49500e1f505000000001600144577a248dba5b765b7cebb901d732e25b4f1c58a040047304402205685b8a03ea20daf4402add7967b085078d79ccf03e012c0974019aa1da40ce4022044173f156e6f31c38fb0458eec6b164f386b2e6d13807ed22c2bf5b02d704a880147304402200fd09dddab990d5ef9273b89cbd4e41724cd125ab53acc19cc789cb01864f3e1022040fb9758ad720509cf2413304be3462678763df1f025c442e9e76e711ffe8a590147522102623965647c6a10136c4c1668e21bb9d34a11b1e2f6389031d8db6525c766e1b6210316b1f2cf8f672401e2ff89a65b7dd185c93c485deeb4085d70c187f9b5ac43d452aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "28bfae9c2f9e2f1b18e68a6dea679b3af5530eb23971149f39f7dbe648ade569",
+        "nonce" : "2bb604a844a6786d4dbf50b86b91d0aa8b8bfa9608227f1e0e7ee1315cdaee49"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-9000686732007318540",
+        "outcome" : "152fd862eb7141341b9da69670b8543a862204443ff516da3ec71bce7042264e",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "7544899229347082571",
+        "outcome" : "25fc69197f3f1c7d418c774d613cfe1076fb266766bce6e409acf99efda40359",
+        "localPayout" : 77788773
+      }, {
+        "preImage" : "-554166065132337959",
+        "outcome" : "c37287ea787be142ef79201bec7531949977ade20db06541d4acfbd7cb6fea9b",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "25fc69197f3f1c7d418c774d613cfe1076fb266766bce6e409acf99efda40359",
+      "oracleSignature" : "2bb604a844a6786d4dbf50b86b91d0aa8b8bfa9608227f1e0e7ee1315cdaee49352a5d4a336019db575ca9daae1b0c2fc2b5e2905ac9a15277f521303c8400d5"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9146266e051eb0a239c39444ed802fd38a7091cd1d58700000000",
+        "idx" : 0,
+        "inputKeys" : [ "420cd2ab391c03a84e2f4be82c0af0cac22b35f1a6c4e67a3a4e3762deb439a0", "80e4a78fa021510bb46092d5eab1bc0423e5bdab7f7c8901149e932a06596eb1" ],
+        "redeemScript" : "00209594d0ab66dced45b23f545f9859787a9f0f5a82a0765431093c580701885fc9",
+        "scriptWitness" : "01475221028cf7f63a363d7c0b7420a6b63d3ec431e6551238601c0584a2a2500bfc2a2bf72102ff47f3be83c6544e4435dd4fec1cb460ceeca80bd27783f8e7266879b714f09452ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ea128c4b9c2cc12809501d87656cae6ff17392f5456a371e8842dc1598f304fe00000000",
+        "idx" : 0,
+        "inputKeys" : [ "00ec2b161cac5f101a444c78ab3e6445e071353e39d73f3a8f9a7fa6cf8fd351", "2d32fe980a0f3a02415df947af668d7b55f772bc9a9f1d96f1e42c4d3b7dfe73" ],
+        "scriptWitness" : "014752210321be1e6f485141fcd528758fc194019c598ce811dd93b9a0e6115b22f13446712103859779e2e291e76b0adf25df9b14fe0a1c0caf13bb7cca5868c65a1e866ef2f252ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914b58d133dcaa9bf0772b1386dbba6c0ff6f1612ab8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "a4ffa01b66941481d754bf543570d35d14adc6b5d3fac695478563bbac42f709", "6e5ce1aa742a31b55e859eab4a0418bd13bb8864bf2fdfd141f19c820316cb51" ],
+        "redeemScript" : "0020b69cb9a357a1ae54cdd5813ac14c0663a8af5fea4a6e37b707d2b84b3ea890c0",
+        "scriptWitness" : "01475221033e1ac0e732d4a4e87a39879ec114a0b727bea9ca3958abbcad9402ad792e46612103e9002d4084bf944b21567a34a86632b9186a69b35e7c19d64f3d43768bbb907552ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002082e67158883590d327c0ef7152807a50ee6ce243cd38f499b10cd4c34d2edf7c00000000",
+        "idx" : 0,
+        "inputKeys" : [ "f87e9bf99780d24594fde77cfa7275919338af5cd42f3b4ac007225ac4c0ebb2", "3134abd83e04c7cac6ad904944fb3326d3b722d53fe005076a321ed5e3f34665" ],
+        "scriptWitness" : "0147522103fb9d97c24a6ee1047121943b47862c5f91dce6aa31c48f89f8d926dae2556c12210270d1867dad40b5a1535934d223865b92a57c8db16152de5e7016eef016eae28652ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600142bc8f5f6fcd2b200a07228db8cab4c06d0fe0f8c00000000",
+        "idx" : 0,
+        "inputKeys" : [ "13b04b8d64f14bf2df320e6b621ee0ca1a3189d6678fdc2b740137118074e060" ],
+        "scriptWitness" : "02002103c79aae9bf555185f0a7e496840eda78abde85f254ad5e5b59203a7c9cd3daf19",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q43kx239urnvm9wxupat5v8eqqccqns67evd6cu",
+      "fundingPrivKey" : "9ab13ebba492d4214e7cad99c55a69a5c8e3f40a5218d72b221dcdc4402658f3",
+      "payoutAddress" : "bcrt1q8r6u32xwytakhhtfl56ghxhrathg559se2yv94"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001409034ef6ebd3e564c913df70f2cb49ebd720851f00000000",
+        "idx" : 0,
+        "inputKeys" : [ "08021a01adddd6d890b4ce0c6f4a1ecbd266cb500caae6bcdc3da35fc6267ad2" ],
+        "scriptWitness" : "020021037a9b6a07284560303b58bf5997edaaeecb4071e2b702da4c7a491b9e1df75600",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200202138bc8a2c3aa061310a4d89dfdfd48d89806af635b3f1877416607105f28f6600000000",
+        "idx" : 0,
+        "inputKeys" : [ "db8dbdfccce3eb044ef97cdc2019ca072da32fff35e3257b05ca08bea9520e4c", "85d4a9a0c57aa7a4162ad97f05ba55d04065079542daa867b1bc462c5c275315" ],
+        "scriptWitness" : "0147522103e1757b408ae9ec0efd66d779f1528025b1bb2be1b596ef0e66e5c8619b9ed7ec2102f80fee2b41c4597f1aea7ed42005081b50170828c5e61130c6661aa3ee3509ef52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qn3up3cuh58symsqvuy06h7vd4naly6taw3mzn3",
+      "fundingPrivKey" : "7a257c1bd750fe9eb4a7b174bf5cd4a109627f8e73f523a5ca7d69e0b1cce416",
+      "payoutAddress" : "bcrt1qr6qhake8r9y5skjm63t7jn5jec3ypcdxr40tn7"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71055142d39303030363836373332303037333138353430000000000bebc20013373534343839393232393334373038323537310000000004a2f665132d3535343136363036353133323333373935390000000000000000fda7124028bfae9c2f9e2f1b18e68a6dea679b3af5530eb23971149f39f7dbe648ade5692bb604a844a6786d4dbf50b86b91d0aa8b8bfa9608227f1e0e7ee1315cdaee490356c291a999aad88d6cb99cd1f5f38f3286b4675309dea2f676f6a31ca5d603610016001438f5c8a8ce22fb6bdd69fd348b9ae3eaee8a50b00000000005f5e1000005fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9146266e051eb0a239c39444ed802fd38a7091cd1d5870000000000000000ffffffff00da002200209594d0ab66dced45b23f545f9859787a9f0f5a82a0765431093c580701885fc9fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ea128c4b9c2cc12809501d87656cae6ff17392f5456a371e8842dc1598f304fe0000000000000000ffffffff00da0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914b58d133dcaa9bf0772b1386dbba6c0ff6f1612ab870000000000000000ffffffff00da00220020b69cb9a357a1ae54cdd5813ac14c0663a8af5fea4a6e37b707d2b84b3ea890c0fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002082e67158883590d327c0ef7152807a50ee6ce243cd38f499b10cd4c34d2edf7c0000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600142bc8f5f6fcd2b200a07228db8cab4c06d0fe0f8c0000000000000000ffffffff006b000000160014ac6c6544bc1cd9b2b8dc0f57461f20063009c35e000000000000000500000064000000c8",
+  "accept" : "a71c66937f5beae57fe0a21623116e2098b03fc9ef1b7de80705fc87f2eb4cd816880000000005f5e10002d8132c7b21647dc3bdf876fe5a3cd32a101d9cd6835a02aa360fb8d2d866c425001600141e817edb271949485a5bd457e94e92ce2240e1a60002fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001409034ef6ebd3e564c913df70f2cb49ebd720851f0000000000000000ffffffff006b0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200202138bc8a2c3aa061310a4d89dfdfd48d89806af635b3f1877416607105f28f660000000000000000ffffffff00da0000001600149c7818e397a1e04dc00ce11fabf98dacfbf2697dfda716fd01e60100963464c237cfb58b0b340d3d3e8a5b17b8818f53b04e9ad43665c966da1fbc7b5ef0276239bba090c06c0a5efc7a04d964e3f858515e37f3cb4437e79b61db0034fa0f54a3eeffa16b00ea7eebb7ee9c7db6a3a6cc63b7b623149815566892f72531e7cd02ef11671ba9b70a519b12ce842c33dff1d0e21fa37319692c38bb9c81b5da3243b3526e234e017dcbb1301a4b1e6ad56c99fd5dc88f2d749a8e18cc01088459e5455d0de754df832c76cfa4688616b9133e07fd39a4068fd62d567f72bd4c5371df4e546feadf11e385f7f45eb0906e03df76ea60a69068a18d9124f0007cfcba97a41e2ced092d43c47ad17b102d8358e3276603f3cfde7c4471aecfec417654595fa665f0a8e534730e001e79374a9775ffa7a8cdc31c641eb0d793308eb771222a5ce1c42760c6b988eda3274f21600a7edc04662e7c4404e86ce78a016f8f5614a46767a329fa7ac9ed0a82f1b91a32d78efea83f85147d27ba766ec891aa77f2259f80bdedfd0f2ad67716daa3ec74b0434fa58118b40d02d44c6bb801a05e9c43a13d2217cf2de36b014aa45f9dc4f3b19f7aea95c47ba4048cdf18a54bee09e6ea377e09bafe390151d137f02563070a1f5ed41451ece8e13d049ffd4f8d41dc52fa5d7db1bc274c3c15d276d3c37abf875eaa6fb87e1fae10c88e272b8dc40754677272792b7344475507bed4bd5711a452b6da7553a3da21cbbc6967b9a6fede243505f6076942eaabf1788fee68572327dff8e5be4968159a4b51",
+  "sign" : "a71ed6230caac4c86f11ca3868629313d90b8329374d054a48f7563906287ff7519efda716fd01e6014ea9a46eee552fdabb791f7ee66136544ee483fff9bf4cce64dd90f05250958b85e0fb4226e12f41b81bf389c837e03199af49b0ee98d2fc9143da5f3333ed1001d0933285459627ae0b93fcc5776f9d15192c2e0d9b8c1077bd98d96de8c205e01e26c53e89e2ebc4feec63111cd7e83d0e1d21258c61a1c3a945c653a5f114bda4bde2abe8775bafe4208d8d707b1636648e51ff8ee82329b5a309884188bf0001168481239f61c8fbed17e39df7f54093a79d7562b6f74cad555fc3663fe5e5eb620e6fe5ef4883b20e81759bb35a3e5b3b9097c9bae331e601a3209c59fcf47e01ec6554acb1116b55aff743aa518b185f05213c771ebf7eb79fad02f6556d914a42c7fd431a784746b9f0f8313bf4d67668cff80be10597c74e5d96fbaae1f8a5dd9642effa3f487c1e3bf5d6943eb3fb653805a7e14ee31d755e066c2a6e9096012f718df32732a0d751a23d55d49b7cb6da2bdeba764236d354baa87a858af85950f893ad190883f93427123d49d985bbbd6e61de7bd1eeb6aee0d9ae6beeb016016940022a654c67fefdf07f6bf5f82958a77d8a8c588da7ff69c2407ea7c822531e58a6a2a2fbb1500076ca7a0aee59b4a7f05f631945c939b0d65694dcec26de10f00b840663f01119486c9ea2cb9a7a01c526feb9999c8dd5b24234bbb6886019f88b9f24a81d62f87de018324ced46bee6f23d435c246140ee32cef422d0ef3bcdd7d140744e0290bcb340ca9d788755d5dbe6adcbf889324518aa9a3373ebfda718fd03ec00050004000000473044022050e44bf90aefae266cfa10e1bf9e0f516b9efcb46b2af6989a447d3f32519e2c022016931b6189605b7949a3cac40b7e6ced2a980f0b8071d01677692d0b84046135010047304402202317869b7cbab43d7a982fe273ce72b588f258ad445036303194deacea550f8d022053f1f50d3e5cc2389dd70986d1e2ee507d4ac0cf0ba6b60354c570bbd7b3a6db0100475221028cf7f63a363d7c0b7420a6b63d3ec431e6551238601c0584a2a2500bfc2a2bf72102ff47f3be83c6544e4435dd4fec1cb460ceeca80bd27783f8e7266879b714f09452ae000400000047304402205906998815dcfd70630235f5b3bbf94d1d72436daced9ce34a239fa5ee2755d602204601958a4d976789fe492286d808d57e0060318a1d7893fd144a7c303fe694a20100473044022032bd48cb835b2584290cc7b34e8ff41915d313f43e2cb4751ff37be2b50715fb0220338bd39744cd8b5a1440507f84a985b37d072b10bd2802227733e52d9c92a4cd01004752210321be1e6f485141fcd528758fc194019c598ce811dd93b9a0e6115b22f13446712103859779e2e291e76b0adf25df9b14fe0a1c0caf13bb7cca5868c65a1e866ef2f252ae00040000004730440220662fda3cb4ff18a064554043d1fb37f31b2f437fe9b435fcb26f6f6d61023afb02202c14064ff80299df67ae0281177fe890a4d4a764bdf97f6340201da26d8b362a010047304402202808d7e5341355a3192ba6a63aacea72f1d1e7a3b1d420f574dccba41aecfd3e022070c1c38a39d7462d71ee94d930dd6131b1f8bc51cec10aadc96133112aad1dfe0100475221033e1ac0e732d4a4e87a39879ec114a0b727bea9ca3958abbcad9402ad792e46612103e9002d4084bf944b21567a34a86632b9186a69b35e7c19d64f3d43768bbb907552ae000400000047304402201ff5bef1a3b8892a5ec6e8dc70db3d38ffc43a94b0d46c881a7c9e37f906c28002206e62f2fda00bb3f876d211f06ac701280852b14e9fad7d5d01cf376c914d679f010047304402201d67e17835d1380b0c07f360941ff1b807f5177a8ec8f1dfc33f9888583e03f2022030b929da685702d41da38bb9a2542ec9e1599b921e2ef30f83117b5422ade2ab010047522103fb9d97c24a6ee1047121943b47862c5f91dce6aa31c48f89f8d926dae2556c12210270d1867dad40b5a1535934d223865b92a57c8db16152de5e7016eef016eae28652ae000200473044022050018e37b1267ca24dacb86cccb149c11af9f894a266ad318d607dedffc724fa022068faa2a7218ac69787e0bc5fa3fe7f54f6336846d6de355a8990daf019e0f5d101002103c79aae9bf555185f0a7e496840eda78abde85f254ad5e5b59203a7c9cd3daf19",
+  "unsignedTxs" : {
+    "fundingTx" : "0200000007c07cc4830c3e2f9983a7436bf76461f7527dc498626a39146d3e4f3fde22547200000000232200209594d0ab66dced45b23f545f9859787a9f0f5a82a0765431093c580701885fc9ffffffff3b8d041afef70b9e00e9c39dea77f471b3fe7686bb7198e99cb4971e142abb560000000000ffffffff125b66d3d50532ec3ab40775ae8e6b54b57893fc6e7f50cd201612fd3817bb980000000023220020b69cb9a357a1ae54cdd5813ac14c0663a8af5fea4a6e37b707d2b84b3ea890c0ffffffff6216becb320103223e58d491a7284718198af4bcbcb2bb250588a021e37e80d70000000000ffffffff73b1070e3408592b7b5af409bb3861e383e3b263db30c16d70134a4eb880cbd10000000000ffffffff1dd33a73bb4ed419eda458db702168f16b66e556972c262b7002ffab1e7fde000000000000ffffffff4c4c69a2e36f58d56a47c031d5958387ffe395c4afe11c25d6e546184bbced950000000000ffffffff0352c5eb0b000000002200207842fb14d3c0d159185ae11b39e6b6ebdaa696c7b751597dc0c5aa8b1ffa7c400ddca43500000000160014ac6c6544bc1cd9b2b8dc0f57461f20063009c35e069de111000000001600149c7818e397a1e04dc00ce11fabf98dacfbf2697d00000000",
+    "cets" : [ "0200000000010116472f33c3f4beaaf24fa27856d8e0bcbb4133fd734b2e68f1102d2ef173b0b00000000000feffffff0100c2eb0b0000000016001438f5c8a8ce22fb6bdd69fd348b9ae3eaee8a50b00147522102d8132c7b21647dc3bdf876fe5a3cd32a101d9cd6835a02aa360fb8d2d866c425210356c291a999aad88d6cb99cd1f5f38f3286b4675309dea2f676f6a31ca5d6036152ae64000000", "0200000000010116472f33c3f4beaaf24fa27856d8e0bcbb4133fd734b2e68f1102d2ef173b0b00000000000feffffff0265f6a2040000000016001438f5c8a8ce22fb6bdd69fd348b9ae3eaee8a50b09bcb4807000000001600141e817edb271949485a5bd457e94e92ce2240e1a60147522102d8132c7b21647dc3bdf876fe5a3cd32a101d9cd6835a02aa360fb8d2d866c425210356c291a999aad88d6cb99cd1f5f38f3286b4675309dea2f676f6a31ca5d6036152ae64000000", "0200000000010116472f33c3f4beaaf24fa27856d8e0bcbb4133fd734b2e68f1102d2ef173b0b00000000000feffffff0100c2eb0b000000001600141e817edb271949485a5bd457e94e92ce2240e1a60147522102d8132c7b21647dc3bdf876fe5a3cd32a101d9cd6835a02aa360fb8d2d866c425210356c291a999aad88d6cb99cd1f5f38f3286b4675309dea2f676f6a31ca5d6036152ae64000000" ],
+    "refundTx" : "0200000000010116472f33c3f4beaaf24fa27856d8e0bcbb4133fd734b2e68f1102d2ef173b0b00000000000feffffff0200e1f5050000000016001438f5c8a8ce22fb6bdd69fd348b9ae3eaee8a50b000e1f505000000001600141e817edb271949485a5bd457e94e92ce2240e1a60147522102d8132c7b21647dc3bdf876fe5a3cd32a101d9cd6835a02aa360fb8d2d866c425210356c291a999aad88d6cb99cd1f5f38f3286b4675309dea2f676f6a31ca5d6036152aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "02000000000107c07cc4830c3e2f9983a7436bf76461f7527dc498626a39146d3e4f3fde22547200000000232200209594d0ab66dced45b23f545f9859787a9f0f5a82a0765431093c580701885fc9ffffffff3b8d041afef70b9e00e9c39dea77f471b3fe7686bb7198e99cb4971e142abb560000000000ffffffff125b66d3d50532ec3ab40775ae8e6b54b57893fc6e7f50cd201612fd3817bb980000000023220020b69cb9a357a1ae54cdd5813ac14c0663a8af5fea4a6e37b707d2b84b3ea890c0ffffffff6216becb320103223e58d491a7284718198af4bcbcb2bb250588a021e37e80d70000000000ffffffff73b1070e3408592b7b5af409bb3861e383e3b263db30c16d70134a4eb880cbd10000000000ffffffff1dd33a73bb4ed419eda458db702168f16b66e556972c262b7002ffab1e7fde000000000000ffffffff4c4c69a2e36f58d56a47c031d5958387ffe395c4afe11c25d6e546184bbced950000000000ffffffff0352c5eb0b000000002200207842fb14d3c0d159185ae11b39e6b6ebdaa696c7b751597dc0c5aa8b1ffa7c400ddca43500000000160014ac6c6544bc1cd9b2b8dc0f57461f20063009c35e069de111000000001600149c7818e397a1e04dc00ce11fabf98dacfbf2697d0400473044022050e44bf90aefae266cfa10e1bf9e0f516b9efcb46b2af6989a447d3f32519e2c022016931b6189605b7949a3cac40b7e6ced2a980f0b8071d01677692d0b840461350147304402202317869b7cbab43d7a982fe273ce72b588f258ad445036303194deacea550f8d022053f1f50d3e5cc2389dd70986d1e2ee507d4ac0cf0ba6b60354c570bbd7b3a6db01475221028cf7f63a363d7c0b7420a6b63d3ec431e6551238601c0584a2a2500bfc2a2bf72102ff47f3be83c6544e4435dd4fec1cb460ceeca80bd27783f8e7266879b714f09452ae040047304402205906998815dcfd70630235f5b3bbf94d1d72436daced9ce34a239fa5ee2755d602204601958a4d976789fe492286d808d57e0060318a1d7893fd144a7c303fe694a201473044022032bd48cb835b2584290cc7b34e8ff41915d313f43e2cb4751ff37be2b50715fb0220338bd39744cd8b5a1440507f84a985b37d072b10bd2802227733e52d9c92a4cd014752210321be1e6f485141fcd528758fc194019c598ce811dd93b9a0e6115b22f13446712103859779e2e291e76b0adf25df9b14fe0a1c0caf13bb7cca5868c65a1e866ef2f252ae04004730440220662fda3cb4ff18a064554043d1fb37f31b2f437fe9b435fcb26f6f6d61023afb02202c14064ff80299df67ae0281177fe890a4d4a764bdf97f6340201da26d8b362a0147304402202808d7e5341355a3192ba6a63aacea72f1d1e7a3b1d420f574dccba41aecfd3e022070c1c38a39d7462d71ee94d930dd6131b1f8bc51cec10aadc96133112aad1dfe01475221033e1ac0e732d4a4e87a39879ec114a0b727bea9ca3958abbcad9402ad792e46612103e9002d4084bf944b21567a34a86632b9186a69b35e7c19d64f3d43768bbb907552ae040047304402201ff5bef1a3b8892a5ec6e8dc70db3d38ffc43a94b0d46c881a7c9e37f906c28002206e62f2fda00bb3f876d211f06ac701280852b14e9fad7d5d01cf376c914d679f0147304402201d67e17835d1380b0c07f360941ff1b807f5177a8ec8f1dfc33f9888583e03f2022030b929da685702d41da38bb9a2542ec9e1599b921e2ef30f83117b5422ade2ab0147522103fb9d97c24a6ee1047121943b47862c5f91dce6aa31c48f89f8d926dae2556c12210270d1867dad40b5a1535934d223865b92a57c8db16152de5e7016eef016eae28652ae02473044022050018e37b1267ca24dacb86cccb149c11af9f894a266ad318d607dedffc724fa022068faa2a7218ac69787e0bc5fa3fe7f54f6336846d6de355a8990daf019e0f5d1012103c79aae9bf555185f0a7e496840eda78abde85f254ad5e5b59203a7c9cd3daf19024730440220701e4931a0fcfa6796c65be66f54b899cf8843bb0b6418ee62ba4d53b1b7dbd4022016702b9cadb3936bb79a071beb4973d1c009995b671b75bd2c65146b31bfb3a10121037a9b6a07284560303b58bf5997edaaeecb4071e2b702da4c7a491b9e1df756000400473044022012e33c14f495f3ac4aed152df534ff98ab8fcff8a02bc70b86686adab6de6bef02207426175c8ff3d0dcc628ffda9bcc9d2aa4d541d02e980a876162e19439ab7554014730440220736fef521d35cf2c290daa9e0b164a2b7af467feb3a222f46d241d0e948f5e4302202d03287aaa1df708ff4b89a98758b827faa6a773a5115482f43e740879bc41420147522103e1757b408ae9ec0efd66d779f1528025b1bb2be1b596ef0e66e5c8619b9ed7ec2102f80fee2b41c4597f1aea7ed42005081b50170828c5e61130c6661aa3ee3509ef52ae00000000",
+    "cets" : [ "0200000000010116472f33c3f4beaaf24fa27856d8e0bcbb4133fd734b2e68f1102d2ef173b0b00000000000feffffff0265f6a2040000000016001438f5c8a8ce22fb6bdd69fd348b9ae3eaee8a50b09bcb4807000000001600141e817edb271949485a5bd457e94e92ce2240e1a604004730440220088459e5455d0de754df832c76cfa4688616b9133e07fd39a4068fd62d567f720220497c3ba05921485e72d32407ea54ad32e28a44c637d9a560f0c6cdc6c34e2e4e01473044022031ed478d0e885ee3d63b0632305d63e4412654fa7991698471687774529ad5690220592cc4c1afa28e84e7954cf917c6b72e35906b27f032e3e7b7eabc7781d06d550147522102d8132c7b21647dc3bdf876fe5a3cd32a101d9cd6835a02aa360fb8d2d866c425210356c291a999aad88d6cb99cd1f5f38f3286b4675309dea2f676f6a31ca5d6036152ae64000000", "0200000000010116472f33c3f4beaaf24fa27856d8e0bcbb4133fd734b2e68f1102d2ef173b0b00000000000feffffff0265f6a2040000000016001438f5c8a8ce22fb6bdd69fd348b9ae3eaee8a50b09bcb4807000000001600141e817edb271949485a5bd457e94e92ce2240e1a60400473044022060314f9aa811b39a5972b53941fea6ca558ad10345a931e17ee27c9b6e1c66a2022058d4bead5121a59f01ec1a3000425ba2267cba9a183d7edf28858c77c52102ea014730440220168481239f61c8fbed17e39df7f54093a79d7562b6f74cad555fc3663fe5e5eb02201aafec9ca77d113c7eb8fb684dc943c91a5ed21b6e909e8216550a3ff134c54c0147522102d8132c7b21647dc3bdf876fe5a3cd32a101d9cd6835a02aa360fb8d2d866c425210356c291a999aad88d6cb99cd1f5f38f3286b4675309dea2f676f6a31ca5d6036152ae64000000" ],
+    "refundTx" : "0200000000010116472f33c3f4beaaf24fa27856d8e0bcbb4133fd734b2e68f1102d2ef173b0b00000000000feffffff0200e1f5050000000016001438f5c8a8ce22fb6bdd69fd348b9ae3eaee8a50b000e1f505000000001600141e817edb271949485a5bd457e94e92ce2240e1a6040047304402202b8dc40754677272792b7344475507bed4bd5711a452b6da7553a3da21cbbc69022067b9a6fede243505f6076942eaabf1788fee68572327dff8e5be4968159a4b5101473044022019f88b9f24a81d62f87de018324ced46bee6f23d435c246140ee32cef422d0ef02203bcdd7d140744e0290bcb340ca9d788755d5dbe6adcbf889324518aa9a3373eb0147522102d8132c7b21647dc3bdf876fe5a3cd32a101d9cd6835a02aa360fb8d2d866c425210356c291a999aad88d6cb99cd1f5f38f3286b4675309dea2f676f6a31ca5d6036152aec8000000"
+  }
+}, {
+  "testInputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "266280c996dd660483d6ac8a2051ef2e1cf75e055d54b73cfab57486acb36119",
+        "nonce" : "7091c648199f24a4dd4d9c7039f45d26061ea773ac2a5aa45d4b93dab09c12b9"
+      },
+      "contractInfo" : [ {
+        "preImage" : "6017883102437321767",
+        "outcome" : "ec5913e103eaab6ce80d75eb907bae29d594f216b2bf5359f6126a8e02670dd1",
+        "localPayout" : 50709953
+      }, {
+        "preImage" : "6682108147697729558",
+        "outcome" : "e90ada0d49f9748b77721167ab8d7ca52472296f02d23fc2af77c923c36e37c0",
+        "localPayout" : 0
+      }, {
+        "preImage" : "6798013576278224344",
+        "outcome" : "962ebcab5b0020ccb271cf2183fe9dcfe8eb1c89a01eacf4f19e341aa68d42e4",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "e90ada0d49f9748b77721167ab8d7ca52472296f02d23fc2af77c923c36e37c0",
+      "oracleSignature" : "7091c648199f24a4dd4d9c7039f45d26061ea773ac2a5aa45d4b93dab09c12b939cd53753366842d45a33aab304e6ed5101aeea98101d815637d365b2e360de1"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020771c0709187875fee4e04253b4a0addba396133dc881a52776f55164c64682b000000000",
+        "idx" : 0,
+        "inputKeys" : [ "82611acf538f7658253b7ea9a4005c13cfd52f8a86a67807ee8b053094839258", "d0c0b89b65a2acb78a265ea1becb3be861292bca3bee4225f1c90a3cbde7c93a" ],
+        "scriptWitness" : "01475221020162ee4b34b316c88c46c50dd2abf8e78ec902aee62781b85da37dc3f35c08f121029a46447fc705dec9b11a0d8b068bb9d09bdaf677293050898f18251cbecce81e52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200202cf9ddcb21445a99a61c964b2d1b8a5e291b7255a93341d7e4d8d55e1963d1d600000000",
+        "idx" : 0,
+        "inputKeys" : [ "f69e3ffdec481a0209befab7f8790801d7bd0fa8eea97c9b3bb88406269c90b1", "637f32232553a9ee0237683c29a78b9a7324bf44ccbd1a8353b978c6bbcbafcd" ],
+        "scriptWitness" : "014752210335c0fe4fbfc2ebb97de658e716f1ab43c749905b277d8e5f09117e2f322104d321027d84bca41d18f317e6b3e035e283140887e7f0f718ba6a0c1c3e0855319c17d252ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914bae2eeccd57ddd317dc39306d112f9bd5368c0158700000000",
+        "idx" : 0,
+        "inputKeys" : [ "008bac101ed706c3ce1545c4c7c04c9ed954971ba1a107d392b4c4d5cec35fe5", "6e8a455914827d4b570a9ba807ddf12f4a55385f562395bae320408c46335bca" ],
+        "redeemScript" : "0020bd0179e2fcb179f0b20b4e0ba7174f16cc8b3e02728276c8c1bdfd9a5abb0185",
+        "scriptWitness" : "014752210360de9b66646fe4631a25ae68a0d8ff598a317782228f0ae1b7c4322e9b944f922103f142230becbb145222d7eb8a5d5110a4077641d99704fe6159f45c3651b3a69b52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002096df9fd697676e6aa799c6e6059b5518013983d99cc5c5a784037f1cef674b3e00000000",
+        "idx" : 0,
+        "inputKeys" : [ "a0abe1052c7a2d090ea25d527fe7ca6b0064fed4fe3338c03bc78f8ffd610f45", "38371279ca1ab47c4550453a23d6ae369810e6f488a2cec181c707255697e852" ],
+        "scriptWitness" : "0147522102b070b3a148d70f180062f9223e81978cac7559ff826bfadacc94036729538b23210377fbf8c6131d7c8a340e3d61a77365f25ddf40fe638db0e04c4a989aa0f839f352ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001421d32ac7a9753b94857190f81693ffbc13d11ab900000000",
+        "idx" : 0,
+        "inputKeys" : [ "e28691c1125f50ee8d7a65ba2f0898fa866dcc635f227003ff04a80af472f049" ],
+        "scriptWitness" : "02002102c73ecdb6675515f16365c10519625b3993862ecf0c35c4e07cf6e9329584939d",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qzhmde6p8a2cgh7gcyyp5sur3klwhcd2n9z8qnu",
+      "fundingPrivKey" : "c39d96cb8f2b90b5ae6b2353c3d1dbae059fcc991d3513695455e4a9fb1019d4",
+      "payoutAddress" : "bcrt1q8g5vvhxq4ryqhc0mwgq7cwczt9p26r9llxu6gm"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209db749a7bc629a969c79a2f602e433dc29c94b3a70fe980692b5e4d652abdca200000000",
+        "idx" : 0,
+        "inputKeys" : [ "7625482076753f7a920460a72d3e4fcc04724d2d7a32ec4183157d44d2fe6c4b", "9958690a96d428992ae12512c3c2c4ba6a9f74290505c996ac58420211246247" ],
+        "scriptWitness" : "01475221028221367c14cd6a3651a15d9d2c2da8c2874d65182ee72e0081a1736bb376b4de210311203a02c62be08fd598e46a21e82bfc01bedc2e036206850eb0bced3333952e52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fa2b8b3623279e5d1298c56d51640a966edb5b8800000000",
+        "idx" : 0,
+        "inputKeys" : [ "7bb2c4dd1776deffdb15966969294e105459cf49f09a3179b1a2157aab4f1123" ],
+        "scriptWitness" : "0200210399737907abc8b2c9afcd83de2d211cd2456e7c775a56e9b9d4973f3661aff3f3",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001439580f5effbfe834d58e8c83b41ae76641df7bc200000000",
+        "idx" : 0,
+        "inputKeys" : [ "9d6797be2af4d25fc33124b66139606958809eb06c97b70316fb2c2a8387d20e" ],
+        "scriptWitness" : "0200210341df160f7b801b5d2deda67fff9fc000db649c73fdfd4c453d7bed113afa157b",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e33f47942de59e57f59144ed1ef08eb05d1c77ca00000000",
+        "idx" : 0,
+        "inputKeys" : [ "3f543e76fbbaf4376bc725e89466ef9e25555ee637bbecacb965b374e3f59b53" ],
+        "scriptWitness" : "02002103dba15b9f2c443d6ea8207599c3b5665cf9f5f9694f88d6cb79d8a0a3e04a926e",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600140cbb63118c6ddc661ca1392890c05c65f8e2393c00000000",
+        "idx" : 0,
+        "inputKeys" : [ "1ecb85338c434b36a04a2beef1515b46dcf8c08356d7079bad79dad995813fb0" ],
+        "scriptWitness" : "020021023a2272a9a329506b3c25fb156be1d013dd574d3a5a536ccb1df77f61566a047c",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qv6phl3e3wne795l8my733nmvmcf55nzh0dn22s",
+      "fundingPrivKey" : "10011d82d036a28ea9b092414e07a20cdf6401db24019340498bc2cbf222aeee",
+      "payoutAddress" : "bcrt1qe98w2a39xys6cdgfxkrk25nn8hmw0j54348ntm"
+    }
+  },
+  "offer" : "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710541336303137383833313032343337333231373637000000000305c5c1133636383231303831343736393737323935353800000000000000001336373938303133353736323738323234333434000000000bebc200fda71240266280c996dd660483d6ac8a2051ef2e1cf75e055d54b73cfab57486acb361197091c648199f24a4dd4d9c7039f45d26061ea773ac2a5aa45d4b93dab09c12b9039facd54e350234b440a6adc82eccbd0314a035b930811600e47e91c9a7fa409d001600143a28c65cc0a8c80be1fb7201ec3b025942ad0cbf0000000005f5e1000005fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020771c0709187875fee4e04253b4a0addba396133dc881a52776f55164c64682b00000000000000000ffffffff00da0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200202cf9ddcb21445a99a61c964b2d1b8a5e291b7255a93341d7e4d8d55e1963d1d60000000000000000ffffffff00da0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914bae2eeccd57ddd317dc39306d112f9bd5368c015870000000000000000ffffffff00da00220020bd0179e2fcb179f0b20b4e0ba7174f16cc8b3e02728276c8c1bdfd9a5abb0185fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002096df9fd697676e6aa799c6e6059b5518013983d99cc5c5a784037f1cef674b3e0000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001421d32ac7a9753b94857190f81693ffbc13d11ab90000000000000000ffffffff006b00000016001415f6dce827eab08bf9182103487071b7dd7c3553000000000000000500000064000000c8",
+  "accept" : "a71cf7d4ba1b2bd9cb3cdf7d9a4afea69af21e29b10403f4b07e6b1eae387d6e85d70000000005f5e100020fbddbc6d003ae2dbccf082581cc9909f1beffa0fdd820304f44d1be11c0b35600160014c94ee576253121ac350935876552733df6e7ca950005fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209db749a7bc629a969c79a2f602e433dc29c94b3a70fe980692b5e4d652abdca20000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fa2b8b3623279e5d1298c56d51640a966edb5b880000000000000000ffffffff006b0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001439580f5effbfe834d58e8c83b41ae76641df7bc20000000000000000ffffffff006b0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e33f47942de59e57f59144ed1ef08eb05d1c77ca0000000000000000ffffffff006b0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600140cbb63118c6ddc661ca1392890c05c65f8e2393c0000000000000000ffffffff006b00000016001466837fc73174f3e2d3e7d93d18cf6cde134a4c57fda716fd01e600e41e37ff8638809d7aed86898e51649cf027669d3916813b387725dfe9f8e22521c063433d7e951d44917768e981cfdeae997f96eb7f6261ff51a60ab466ce9c011b181584ed9d5d84a98ff70fb33c69f16a9bf7919a8d6e78ef6905300f1e0c82681203afdd510320564d972087c145603422e2ee7c8d3f867b4adcb01b69724fc18801770939808abb398a4fb389c209e988172dc0c29853987b85fecf980867017419be7899e7be50d782d199635b0a57874421613379eaa520e01c28efda04ecc0426b0fbbe98c00b48f6fc79eb7c89b4da68a4dd3e22ea17fc46a51571b9fc70166cd2679b4c053dd1770740ccc5778889bff50051a69ee797e786d953ce87a1e7506140fc26494ce9b7417403236291bce7793e1ad9af05def833559f966f8981d52984de6338e041fb06c44b89b95d2b9218a4123836cc81cba39e5ea1b56e80073083f00bf50bc0b09b23afba677e2b04bcc4c8ef5abfc0ea3db1decccaac4e7ca823741cb3a04b3896827a4f906f27d730069fb58638d13ec1dc8c6a2f431e7001df93d1883455c541bd7fdb0eb61f931e27678db0674462c70695c36adb5bf22ea071c3eefafbf3be5373fc703e8232a450089b77286a20580eca478f30cf90b6fcf24b047ac99a83e9c66983a032b515bcc79a371fdaa587a52fd3a522bb6ff597dc0b6bf05e0264c5cd72c5812c84f284a99e7b630e7c661b3e81d4ebe92af59edb9c51e6cc2b166be946a21ba3bb963f8a16b3085c66ce4487f383dd0fbc5",
+  "sign" : "a71eb9952f5eb2fd782d545066ec482203ab729ae687b90b4b5ee040cc2608263299fda716fd01e6003f0103f5ff06f2e9e18fa80ebcddbc60a2e79c395244fa8ee6c122725156526566b768385fb5bcb4d0097867dd06bed90bed53eb1559f267de78e451340b8bdb01aa72bdd6d7b415118a8cc87ded520b8250e2744ecf9ef3320dd627c87de7a0790970f86509286bd424bfd08e5b112ea10e93d4d0ab80754c5a320ec2924eb07c91476b3b6947bbeaff6ed39354ec98e090a46ee5866e73efef9265bd29c7eb7901bc0473e976e9f68af78b032a005bc0091a08d06889f2c4c1cbe757272f63afb08e4309c48cc0d14daca23fe912591a22675c1703bb0e3e3b85fc02bbf9813556014f00f3a02adb5ad5e7a6eeae9bbdd2939241212cd4fa8ed59f917dd20db3578e0ca4f0b3e4046df7f8c4b6d8590c52d0d6d8976e3df801012777aada1abca708358096664af8bcbdd64185ef00909374e9999e6d830aa4447b803d70355259f101c62e3e4a1d1f509324d6450ec2a9aa4474ac5ccca77a70e0a572edcf2e9664227988b2277156f2a88d58b0450a1ae8c25601b81c65280c3262c645b77a6cc5c601c6381d258a983f9ddc4cd9edb40b5bd1d7c93f4a6ef376c72f3129487442a69804b7ada55229a5c508fa0fcd40d04cc70d11777237cedae6ce6dc7cd174ee35f3cb738db28062f4e2c9cdc45232074afac956862279bf040e6a4493c0b4c7126765b7759dfd085f425d0dd6830cead2ca1a83b576ba88d0d54041750ef1f812d470e4c50c249ea795c80f9ef1f64581360abd57f2ad4cd585aa1c2c2f71bc000fda718fd03ec00050004000000473044022013b34929389ea4ad93f2f6d25c79530d5f2ee939b903508909a35ef31c8b266b022067c47f19538616e9ba1009cbe4a142d310e8ff3d0351287981b5fa29548ff21c010047304402204e7fbe598b08bac78546bc16b52210e32cd920c67fddc42bfe9c97055165322302202b80a6cc6bdb57b374bc2e1bb420f4d87a01f341d6d483b1b46f83ec5c8da9870100475221020162ee4b34b316c88c46c50dd2abf8e78ec902aee62781b85da37dc3f35c08f121029a46447fc705dec9b11a0d8b068bb9d09bdaf677293050898f18251cbecce81e52ae000400000047304402206bf55a82118347394481bf3e2f90e151cacd1d729dff0fddb3e115e98033e33f0220170cdf7d84be176940518c5b979286df5340ddeb91e9be46e301e31e360f4359010047304402202d07aa6e900e55048777597a603644a95a0c4c969244c24b5f3c0e4477a6b759022060c6681042177e2914a68d67ddc42208c9ef5051d0abfeb8e6a7481cb7fcf19d01004752210335c0fe4fbfc2ebb97de658e716f1ab43c749905b277d8e5f09117e2f322104d321027d84bca41d18f317e6b3e035e283140887e7f0f718ba6a0c1c3e0855319c17d252ae0004000000473044022064cff2402e3f8e003a41695268004630a480fd39ee255b2d59f235ec4ada72d302201b71e4857f2d6e83e377611f49c52043734d82a8243bffdf85eefc7990a5ce370100473044022051a0a4e44e997a05ec12e121cb1b6770579297d07df092a12123d38bab33f092022020d7c4bfca36f5b9ee0c6531a1d6ff8cccbfce9784a20e5b441a8004beb2d49b01004752210360de9b66646fe4631a25ae68a0d8ff598a317782228f0ae1b7c4322e9b944f922103f142230becbb145222d7eb8a5d5110a4077641d99704fe6159f45c3651b3a69b52ae0004000000473044022028ed63822de67facbe76fc77f624b9f8a0e25ecb12794b303029591bc3ce621b02206a94cede4a63268ad254c866f8bf722f83bcc96ce3e8769187de90a396e80a6d010047304402200a57a26d88da3e9dc4e5c9ce1a158971ac5ad9c1322fbfb22742d90b41c5674502206e3d6effbb6c417c8a7c6c3046707dc726fcded4263a9a2f385faa72a6acba61010047522102b070b3a148d70f180062f9223e81978cac7559ff826bfadacc94036729538b23210377fbf8c6131d7c8a340e3d61a77365f25ddf40fe638db0e04c4a989aa0f839f352ae000200473044022023cb37336de771331b21f19f22c5212fe7ed0204b0a1540711b521c9ac04f02d02204726b11cea80716da205c255fcd61302afd5c9260b0d07fd4981e8c6d323b06b01002102c73ecdb6675515f16365c10519625b3993862ecf0c35c4e07cf6e9329584939d",
+  "unsignedTxs" : {
+    "fundingTx" : "020000000ada02641c236df6878a6dcea2a581768c7a27be8bf92b7afaafe6b163f140c4060000000000ffffffff933a0472f883cf782dc574408f5c21900d957f5cc937fc1f6a0471379cbc1e4e0000000000ffffffff30ca9a46179b732131234983c2f30d619f8436d4be745c3f36597c6ed39f35c80000000023220020bd0179e2fcb179f0b20b4e0ba7174f16cc8b3e02728276c8c1bdfd9a5abb0185fffffffff66b9ab3ae7580719c19a71e35ed40888fb7da0361c9b878b8bbe9bd3cdc82c70000000000ffffffff58bec85179f5fa28c9da0f8993fd9c4b134fa3ecef20c8214ae8a1dbe5b2c48b0000000000ffffffff31e262a64c5701a2ffe0df3c1de504fbf7f49ade8035a748813f2fc69aadc1cb0000000000ffffffff9206182741b84d21bb571a97012ea4f6edd87d89db067329ed07ad9f78421fa40000000000ffffffffd1951df5adb4d4401b98b4f9dcb4b4f7dee261f62aefc7909fa2f02f3a9eb19e0000000000ffffffff50dac8b00519d25ca3100346223d4678f97cba03dba0a3261fdf8d445b6820fe0000000000ffffffff2240d5829aed62f87379c1ad33bab78912f837d93a34a6cbfc76f0455e1e2b4f0000000000ffffffff0352c5eb0b000000002200204219e94cda4f41174937710ec3e851e3e6d495d0ebdc65b551a43c4d2a31f8c8bcdca4350000000016001415f6dce827eab08bf9182103487071b7dd7c35530adfa4350000000016001466837fc73174f3e2d3e7d93d18cf6cde134a4c5700000000",
+    "cets" : [ "020000000001014eb748751e625e8b20fbffba8357b36c599984b6a6fc2d8b11b324994595414e0000000000feffffff02c1c50503000000001600143a28c65cc0a8c80be1fb7201ec3b025942ad0cbf3ffce50800000000160014c94ee576253121ac350935876552733df6e7ca9501475221020fbddbc6d003ae2dbccf082581cc9909f1beffa0fdd820304f44d1be11c0b35621039facd54e350234b440a6adc82eccbd0314a035b930811600e47e91c9a7fa409d52ae64000000", "020000000001014eb748751e625e8b20fbffba8357b36c599984b6a6fc2d8b11b324994595414e0000000000feffffff0100c2eb0b00000000160014c94ee576253121ac350935876552733df6e7ca9501475221020fbddbc6d003ae2dbccf082581cc9909f1beffa0fdd820304f44d1be11c0b35621039facd54e350234b440a6adc82eccbd0314a035b930811600e47e91c9a7fa409d52ae64000000", "020000000001014eb748751e625e8b20fbffba8357b36c599984b6a6fc2d8b11b324994595414e0000000000feffffff0100c2eb0b000000001600143a28c65cc0a8c80be1fb7201ec3b025942ad0cbf01475221020fbddbc6d003ae2dbccf082581cc9909f1beffa0fdd820304f44d1be11c0b35621039facd54e350234b440a6adc82eccbd0314a035b930811600e47e91c9a7fa409d52ae64000000" ],
+    "refundTx" : "020000000001014eb748751e625e8b20fbffba8357b36c599984b6a6fc2d8b11b324994595414e0000000000feffffff0200e1f505000000001600143a28c65cc0a8c80be1fb7201ec3b025942ad0cbf00e1f50500000000160014c94ee576253121ac350935876552733df6e7ca9501475221020fbddbc6d003ae2dbccf082581cc9909f1beffa0fdd820304f44d1be11c0b35621039facd54e350234b440a6adc82eccbd0314a035b930811600e47e91c9a7fa409d52aec8000000"
+  },
+  "signedTxs" : {
+    "fundingTx" : "0200000000010ada02641c236df6878a6dcea2a581768c7a27be8bf92b7afaafe6b163f140c4060000000000ffffffff933a0472f883cf782dc574408f5c21900d957f5cc937fc1f6a0471379cbc1e4e0000000000ffffffff30ca9a46179b732131234983c2f30d619f8436d4be745c3f36597c6ed39f35c80000000023220020bd0179e2fcb179f0b20b4e0ba7174f16cc8b3e02728276c8c1bdfd9a5abb0185fffffffff66b9ab3ae7580719c19a71e35ed40888fb7da0361c9b878b8bbe9bd3cdc82c70000000000ffffffff58bec85179f5fa28c9da0f8993fd9c4b134fa3ecef20c8214ae8a1dbe5b2c48b0000000000ffffffff31e262a64c5701a2ffe0df3c1de504fbf7f49ade8035a748813f2fc69aadc1cb0000000000ffffffff9206182741b84d21bb571a97012ea4f6edd87d89db067329ed07ad9f78421fa40000000000ffffffffd1951df5adb4d4401b98b4f9dcb4b4f7dee261f62aefc7909fa2f02f3a9eb19e0000000000ffffffff50dac8b00519d25ca3100346223d4678f97cba03dba0a3261fdf8d445b6820fe0000000000ffffffff2240d5829aed62f87379c1ad33bab78912f837d93a34a6cbfc76f0455e1e2b4f0000000000ffffffff0352c5eb0b000000002200204219e94cda4f41174937710ec3e851e3e6d495d0ebdc65b551a43c4d2a31f8c8bcdca4350000000016001415f6dce827eab08bf9182103487071b7dd7c35530adfa4350000000016001466837fc73174f3e2d3e7d93d18cf6cde134a4c570400473044022013b34929389ea4ad93f2f6d25c79530d5f2ee939b903508909a35ef31c8b266b022067c47f19538616e9ba1009cbe4a142d310e8ff3d0351287981b5fa29548ff21c0147304402204e7fbe598b08bac78546bc16b52210e32cd920c67fddc42bfe9c97055165322302202b80a6cc6bdb57b374bc2e1bb420f4d87a01f341d6d483b1b46f83ec5c8da98701475221020162ee4b34b316c88c46c50dd2abf8e78ec902aee62781b85da37dc3f35c08f121029a46447fc705dec9b11a0d8b068bb9d09bdaf677293050898f18251cbecce81e52ae040047304402206bf55a82118347394481bf3e2f90e151cacd1d729dff0fddb3e115e98033e33f0220170cdf7d84be176940518c5b979286df5340ddeb91e9be46e301e31e360f43590147304402202d07aa6e900e55048777597a603644a95a0c4c969244c24b5f3c0e4477a6b759022060c6681042177e2914a68d67ddc42208c9ef5051d0abfeb8e6a7481cb7fcf19d014752210335c0fe4fbfc2ebb97de658e716f1ab43c749905b277d8e5f09117e2f322104d321027d84bca41d18f317e6b3e035e283140887e7f0f718ba6a0c1c3e0855319c17d252ae0400473044022064cff2402e3f8e003a41695268004630a480fd39ee255b2d59f235ec4ada72d302201b71e4857f2d6e83e377611f49c52043734d82a8243bffdf85eefc7990a5ce3701473044022051a0a4e44e997a05ec12e121cb1b6770579297d07df092a12123d38bab33f092022020d7c4bfca36f5b9ee0c6531a1d6ff8cccbfce9784a20e5b441a8004beb2d49b014752210360de9b66646fe4631a25ae68a0d8ff598a317782228f0ae1b7c4322e9b944f922103f142230becbb145222d7eb8a5d5110a4077641d99704fe6159f45c3651b3a69b52ae0400473044022028ed63822de67facbe76fc77f624b9f8a0e25ecb12794b303029591bc3ce621b02206a94cede4a63268ad254c866f8bf722f83bcc96ce3e8769187de90a396e80a6d0147304402200a57a26d88da3e9dc4e5c9ce1a158971ac5ad9c1322fbfb22742d90b41c5674502206e3d6effbb6c417c8a7c6c3046707dc726fcded4263a9a2f385faa72a6acba610147522102b070b3a148d70f180062f9223e81978cac7559ff826bfadacc94036729538b23210377fbf8c6131d7c8a340e3d61a77365f25ddf40fe638db0e04c4a989aa0f839f352ae02473044022023cb37336de771331b21f19f22c5212fe7ed0204b0a1540711b521c9ac04f02d02204726b11cea80716da205c255fcd61302afd5c9260b0d07fd4981e8c6d323b06b012102c73ecdb6675515f16365c10519625b3993862ecf0c35c4e07cf6e9329584939d040047304402200b8203d648ac0eb595cc95c165b97992e286083cbad716a37dc9e2102233c9e502204ee14b0105273ded23cd8ee2cf27845de29d23fe94d904b0cef8f46684eac38a01473044022050a6fa4c544c1a6ce2da0a86ec8c60d36d47e9d7fb9995bd6beda318f4bacfe502202e258fa1da08ea9287a22c61a73e8616ab59df5ac4b06bb3a81f6ac8b458523401475221028221367c14cd6a3651a15d9d2c2da8c2874d65182ee72e0081a1736bb376b4de210311203a02c62be08fd598e46a21e82bfc01bedc2e036206850eb0bced3333952e52ae024730440220128f470da4f8d28cfabd7fe4dc1572d6ccf25ab1d1a3447d3a87db3a7b52ec1e02206cc4960f4c7082c5883bd5696a27d0fa577133b6203e0637a24d4b7654f6688801210399737907abc8b2c9afcd83de2d211cd2456e7c775a56e9b9d4973f3661aff3f3024730440220448c6cbc10f18403bb1d15cd59989bd5a9df2f708ef1d602ffc4cb88b961ccc40220262498c5c4bb6a63c4161288a4a653e0f6513a2e3ead0ce7d9ae282fd50ff59801210341df160f7b801b5d2deda67fff9fc000db649c73fdfd4c453d7bed113afa157b02473044022045fdfe26e946072bd58fd216f7a78e2a77d1c3bd04f7dae2a27c0cc984e3c21102207351b71e23b9b1c0d432faa5cbd9aa9e65176bc703b7b1e54bcdec65c916e646012103dba15b9f2c443d6ea8207599c3b5665cf9f5f9694f88d6cb79d8a0a3e04a926e0247304402207c0966e8c81db2cf35a8c929e6df360bd41e950d5843246a742cddf57bdf92f00220244d17b85e96d02d1b05710b91c5e3a985725080de32a53f04492a00054b0d4a0121023a2272a9a329506b3c25fb156be1d013dd574d3a5a536ccb1df77f61566a047c00000000",
+    "cets" : [ "020000000001014eb748751e625e8b20fbffba8357b36c599984b6a6fc2d8b11b324994595414e0000000000feffffff0100c2eb0b00000000160014c94ee576253121ac350935876552733df6e7ca95040047304402207419be7899e7be50d782d199635b0a57874421613379eaa520e01c28efda04ec0220616d1f2490dd7ccaec17aeb73f3572240bb469d7f51a67fbbe81758b7983fe7e0147304402204aa03e909497352f6d1e45af1989f9fe63236e48b14624f61dbad39d944a4b7d022036f7e336d928083bf8e9274a76109b24802fe6dc228bc339db851ea470312b4b01475221020fbddbc6d003ae2dbccf082581cc9909f1beffa0fdd820304f44d1be11c0b35621039facd54e350234b440a6adc82eccbd0314a035b930811600e47e91c9a7fa409d52ae64000000", "020000000001014eb748751e625e8b20fbffba8357b36c599984b6a6fc2d8b11b324994595414e0000000000feffffff0100c2eb0b00000000160014c94ee576253121ac350935876552733df6e7ca9504004730440220050c4f52388f68190893243fe8332b857bd937eeaac4cea1b584eb8db748bfab022002e3da757371ef32ca9177191458bba7abd63b261e7fb1ef247db56417d5f21301483045022100bc0473e976e9f68af78b032a005bc0091a08d06889f2c4c1cbe757272f63afb002203bb3125ca304f0c004744177aacb6f1938a45de9bf00aa62322f774f2ce44fa801475221020fbddbc6d003ae2dbccf082581cc9909f1beffa0fdd820304f44d1be11c0b35621039facd54e350234b440a6adc82eccbd0314a035b930811600e47e91c9a7fa409d52ae64000000" ],
+    "refundTx" : "020000000001014eb748751e625e8b20fbffba8357b36c599984b6a6fc2d8b11b324994595414e0000000000feffffff0200e1f505000000001600143a28c65cc0a8c80be1fb7201ec3b025942ad0cbf00e1f50500000000160014c94ee576253121ac350935876552733df6e7ca9504004730440220597dc0b6bf05e0264c5cd72c5812c84f284a99e7b630e7c661b3e81d4ebe92af022059edb9c51e6cc2b166be946a21ba3bb963f8a16b3085c66ce4487f383dd0fbc5014730440220765b7759dfd085f425d0dd6830cead2ca1a83b576ba88d0d54041750ef1f812d0220470e4c50c249ea795c80f9ef1f64581360abd57f2ad4cd585aa1c2c2f71bc00001475221020fbddbc6d003ae2dbccf082581cc9909f1beffa0fdd820304f44d1be11c0b35621039facd54e350234b440a6adc82eccbd0314a035b930811600e47e91c9a7fa409d52aec8000000"
+  }
+} ]
\ No newline at end of file
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_tx_test.json b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_tx_test.json
new file mode 100644
index 0000000000..f016bb95ba
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/testgen/dlc_tx_test.json
@@ -0,0 +1,2110 @@
+[ {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "f75073b0f0cdf47d7ffa489cac65dde873d9a49b20d93055edabfe4a501c88c5",
+        "nonce" : "181e26121e619264c382fae05ececcdd0ea21b669937d568cfbe2a5be30c7c58"
+      },
+      "contractInfo" : [ {
+        "preImage" : "8200200127641297992",
+        "outcome" : "d1da3fcea2fea9d819b42670be7fd737cbfc4894ee90cbc325978c6b6157dc80",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-2406860476414668446",
+        "outcome" : "a4dbe52f588d64ed30fe70846682cb5d31d55da391c9ea061b2fee74e2b0c090",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "a4dbe52f588d64ed30fe70846682cb5d31d55da391c9ea061b2fee74e2b0c090",
+      "oracleSignature" : "181e26121e619264c382fae05ececcdd0ea21b669937d568cfbe2a5be30c7c5866fe4a716c7769d44e9f96972626eaacccb1d6cde4c944e17b814a3c8ec7c96f"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001491cf755b8040280ec2cbc624ba2247ad0776bfa100000000",
+        "idx" : 0,
+        "inputKeys" : [ "7114dd8ee71b609d7e0cac918462cafccb4306b417308994122f78a1d5e6ea44" ],
+        "scriptWitness" : "0200210268c04f8a0a42a0a9f08e3afa15702dd8f9d46bb5e583c1b8a0f86f11d317d3b0",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qvdjalfg0rqssvh2tkcum8vxgk050hxqpzd7n59",
+      "fundingPrivKey" : "76d6a9ce05e355c8f610cd8112e7bdf4d0108d2836fefc5226139f6c6f174448",
+      "payoutAddress" : "bcrt1qcu8ymh5j7gg2evy9j25r6ys2h4qc5qxvnrgrs2"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b2962d17848f602ea2babb69d215811374de393600000000",
+        "idx" : 0,
+        "inputKeys" : [ "61ed52090fb78fe8195f3420905c22642eeffe4844fdbf6201996f3c1e2e3f47" ],
+        "scriptWitness" : "02002102b7e5cb086674e34cbc4b7852d09cc7076f81b6b062924b902fd45327dbc821b1",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q089kdrttpsc6j22aptsskznw4zp7539wty9h3d",
+      "fundingPrivKey" : "ef48817126ce52d3971678dd91f114193b9f303c6fbdd0ca1e912482d1df3387",
+      "payoutAddress" : "bcrt1qs4wfdm4d0aazc9da6zd56a5mx6v87a409xsx4d"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000002f591c27c8ed638995350d68e591d9076857056c7636a5ab5a952ee7fed29d7610000000000ffffffffa279eefe3fb35e4ff2d983c10d8a475a24b07da0bcfab84411d34359091e2b6b0000000000ffffffff0352c5eb0b000000002200204080ca072804e34842643f60162d70942adbd08c6fad9a4645627a39c6a8f2f9e1dcf505000000001600146365dfa50f1821065d4bb639b3b0c8b3e8fb9801e1dcf5050000000016001479cb668d6b0c31a9295d0ae10b0a6ea883ea44ae00000000",
+    "cets" : [ "020000000001013bca6ea51615208e45fea5216a0d1c2d324578bb9ef76b1c271d3edfbcd579990000000000feffffff0100c2eb0b00000000160014855c96eead7f7a2c15bdd09b4d769b36987f76af01475221027fe83dac71aa851fc2516c2ba15cc154946a39f8341571a2c1a090a75a77893f21036c1fbe19544034b25c3b37c8f5696f63ffa26a8d6abb62fbe15a9bb0898a8d2352ae64000000", "020000000001013bca6ea51615208e45fea5216a0d1c2d324578bb9ef76b1c271d3edfbcd579990000000000feffffff0100c2eb0b00000000160014c70e4dde92f210acb08592a83d120abd418a00cc01475221027fe83dac71aa851fc2516c2ba15cc154946a39f8341571a2c1a090a75a77893f21036c1fbe19544034b25c3b37c8f5696f63ffa26a8d6abb62fbe15a9bb0898a8d2352ae64000000" ],
+    "refundTx" : "020000000001013bca6ea51615208e45fea5216a0d1c2d324578bb9ef76b1c271d3edfbcd579990000000000feffffff0200e1f50500000000160014c70e4dde92f210acb08592a83d120abd418a00cc00e1f50500000000160014855c96eead7f7a2c15bdd09b4d769b36987f76af01475221027fe83dac71aa851fc2516c2ba15cc154946a39f8341571a2c1a090a75a77893f21036c1fbe19544034b25c3b37c8f5696f63ffa26a8d6abb62fbe15a9bb0898a8d2352aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "55a9f7d5e5e83fcaf1a6f4c95fe2cdc710eb5d283dccf49a0a93aafcc0185c3e",
+        "nonce" : "288c7ff0e2a4879e4e2e36c8b6e3cfbbda295d0c2b71e2723ef67a98b6189122"
+      },
+      "contractInfo" : [ {
+        "preImage" : "7319200615978707484",
+        "outcome" : "dae9c237b94f952218a368a3fdbb43d03f7cd29e3f20b9e481efe6d18020f86f",
+        "localPayout" : 0
+      }, {
+        "preImage" : "4756645126684352179",
+        "outcome" : "42926b67351d60b128798627a9180255263860ff5643fd9810bdfc67e3928a6b",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "9034299618657372637",
+        "outcome" : "1d734109f8c9785556ccb3db80232d3442c57a3bb580108bf0349ca6dbd33c69",
+        "localPayout" : 38790487
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "42926b67351d60b128798627a9180255263860ff5643fd9810bdfc67e3928a6b",
+      "oracleSignature" : "288c7ff0e2a4879e4e2e36c8b6e3cfbbda295d0c2b71e2723ef67a98b6189122c0b55a5e0b9c3aa9147f02588589b11cd6e25f1ac12de11b2d3142ac613ec801"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014c4fa69866c26f6cb27eb93dd30b3edfb484e8be500000000",
+        "idx" : 0,
+        "inputKeys" : [ "9c35f87c3701cbfcd7a8e8cc7de430785e63736b065e1fac8d7281b710009dc8" ],
+        "scriptWitness" : "0200210346573cbba48f3d94f39706603ad9010c79832b37f0fbae6076b57ddfce78be2f",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q4h795g8x4s62xg294kumqrz766pcuawg99p2xu",
+      "fundingPrivKey" : "20fdbb6a7de3ed6a9f37ce0f7f2ecd02dc0b164f79d895c6f0bf175d22671a77",
+      "payoutAddress" : "bcrt1qpmpf9s702pgn05tz2zfctntrhp5satzj4h2s4d"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148020f45324d4512652f3da5723f70f2d76475ba000000000",
+        "idx" : 0,
+        "inputKeys" : [ "e80ed3801783893a14f799a80da296bdd19b341e513478de25565054084bc33f" ],
+        "scriptWitness" : "02002102ba16f653d2f9018944de3a16400da050602444a6449b21d72894f5367921f631",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qg7vk97w67vhngnc207zfw0er8uglgym9zh92qv",
+      "fundingPrivKey" : "e683e7086eb813f65ab28a449ae3b66700995de7cdc92c8fe4a907e0f18df5c6",
+      "payoutAddress" : "bcrt1ql6k3h8chjzl3kev3r93q4vz5c02qeqsn6jt0dk"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000002afc4fc793f9b44739e591cad49ef3b65ab6b28fe88e9cb79e380b4ef5ce63d830000000000ffffffff537f483141ac42baef6767e85dfc11da694109c058db29502fa6e26c75071de10000000000ffffffff0352c5eb0b000000002200204614d35a6de55248cf054f6153da6685271e4d3e1ee8c36f18be7af737c97af5e1dcf50500000000160014adfc5a20e6ac34a32145adb9b00c5ed6838e75c8e1dcf50500000000160014479962f9daf32f344f0a7f84973f233f11f4136500000000",
+    "cets" : [ "02000000000101288d05b93e014dd05d589f66972bc6be0012774d9526e17d54a63c82aca5c8fd0000000000feffffff0100c2eb0b00000000160014fead1b9f1790bf1b659119620ab054c3d40c82130147522102a0e57554e2714d863f1d4c15b4fc5f0a99e69336bf684d7298f9171d2e19a18f2102bd3728737e0171970c87a9142f719a32a0bff81f0bf9c93171f5eff62fd11d8d52ae64000000", "02000000000101288d05b93e014dd05d589f66972bc6be0012774d9526e17d54a63c82aca5c8fd0000000000feffffff0100c2eb0b000000001600140ec292c3cf505137d162509385cd63b8690eac520147522102a0e57554e2714d863f1d4c15b4fc5f0a99e69336bf684d7298f9171d2e19a18f2102bd3728737e0171970c87a9142f719a32a0bff81f0bf9c93171f5eff62fd11d8d52ae64000000", "02000000000101288d05b93e014dd05d589f66972bc6be0012774d9526e17d54a63c82aca5c8fd0000000000feffffff0257e54f02000000001600140ec292c3cf505137d162509385cd63b8690eac52a9dc9b0900000000160014fead1b9f1790bf1b659119620ab054c3d40c82130147522102a0e57554e2714d863f1d4c15b4fc5f0a99e69336bf684d7298f9171d2e19a18f2102bd3728737e0171970c87a9142f719a32a0bff81f0bf9c93171f5eff62fd11d8d52ae64000000" ],
+    "refundTx" : "02000000000101288d05b93e014dd05d589f66972bc6be0012774d9526e17d54a63c82aca5c8fd0000000000feffffff0200e1f505000000001600140ec292c3cf505137d162509385cd63b8690eac5200e1f50500000000160014fead1b9f1790bf1b659119620ab054c3d40c82130147522102a0e57554e2714d863f1d4c15b4fc5f0a99e69336bf684d7298f9171d2e19a18f2102bd3728737e0171970c87a9142f719a32a0bff81f0bf9c93171f5eff62fd11d8d52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "9b901bbbac8b81e71310644639102cc675a6d669909e8c4b86670b176ea3e02a",
+        "nonce" : "5501d984186f88c570ad98f9d81d8dcc2cdb88d49c65df6993a4f496e4680dc7"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-1622030369901458720",
+        "outcome" : "92fd68ff9c0cd3574301f2902ea3488c4d52987c2f9873367291b59d9adec1f7",
+        "localPayout" : 110995412
+      }, {
+        "preImage" : "7038199812558559489",
+        "outcome" : "d94e885fc935906152d31b6438821f03d79a2cc54d519123b88965c58df0e727",
+        "localPayout" : 63649671
+      }, {
+        "preImage" : "8470821416703332139",
+        "outcome" : "23223c6fbf3dc76fd32d728ac96de5463122fedc776f63d75ef5c933018e3ff7",
+        "localPayout" : 169463715
+      }, {
+        "preImage" : "-6987012607586805058",
+        "outcome" : "c3be02d4edbd52d67886a019f7996e9f3865ba842e76f87b54eab07b3d2f5ecf",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-2539659022645005896",
+        "outcome" : "cf3966235bc3202c615ad4e5d9c71a6e238080f4772e433f3c05a154f914ea1d",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "cf3966235bc3202c615ad4e5d9c71a6e238080f4772e433f3c05a154f914ea1d",
+      "oracleSignature" : "5501d984186f88c570ad98f9d81d8dcc2cdb88d49c65df6993a4f496e4680dc70cbe9cd5005765d371437dc04b47c1cf42b442d9b4bf5f1483d3b4a1c4263cb6"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ed5807aa5824c660a7f60f21cce636f1fb7da81600000000",
+        "idx" : 0,
+        "inputKeys" : [ "52574de89a1ebb49653f74881186b9678935ee4edf8e5ce6e46d393722657e7b" ],
+        "scriptWitness" : "0200210238d81e28bee7aebdc27c529e3bdc0fdd8555a00ea3d2efd9aedc0370ab7906d1",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qf49m8f8wjmfm40ptpmg6d86klm5cnd3eay668f",
+      "fundingPrivKey" : "ce270d3e2be099f4a6f614b2f1c89a2082403e5b54f7863cec8dd12a3583e045",
+      "payoutAddress" : "bcrt1qz5ewjjdmhq32gpnrjp9nf0d55cex7cvz6f8m4a"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600147aed80106979c197295b8c841287761f7d03dfa600000000",
+        "idx" : 0,
+        "inputKeys" : [ "9fc78773574ba0ca9310c7263d5d99eca48160ad7e21c894e814beee1482214c" ],
+        "scriptWitness" : "0200210237dfc1290d45a6e28c4ebe98ca6a2609cf8c06d9c0c682f588b4e140cdc6daba",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qvqy3vpq2zp28qmdpj9nr05dakvjm7j5vf3hfhr",
+      "fundingPrivKey" : "6968293db6772286d25e07bc7cce4120b33de8e9bcc9fd73a81cff7411872391",
+      "payoutAddress" : "bcrt1qnzdn5hr5k0uevr7e4ujk7xtq69qd7m9l6ymln4"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "020000000201c719f7cc5f570c52e39a5d636456463a51f5fba665ac929a59ec4814878ff20000000000ffffffffc119dadc65bb28bd993f939718c8aa622d6879c064725cefa685e79135fbe95f0000000000ffffffff0352c5eb0b00000000220020958dc5bd0b9005ecf8ca4542d6fecd71c2d5e35aa2721ef9b9f8d37a45e86f7de1dcf505000000001600144d4bb3a4ee96d3babc2b0ed1a69f56fee989b639e1dcf50500000000160014600916040a1054706da1916637d1bdb325bf4a8c00000000",
+    "cets" : [ "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff02d4a79d06000000001600141532e949bbb822a40663904b34bdb4a6326f61822c1a4e0500000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000", "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff028737cb03000000001600141532e949bbb822a40663904b34bdb4a6326f6182798a200800000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000", "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff02a3cf190a000000001600141532e949bbb822a40663904b34bdb4a6326f61825df2d10100000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000", "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff0100c2eb0b000000001600141532e949bbb822a40663904b34bdb4a6326f61820147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000", "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff0100c2eb0b00000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000" ],
+    "refundTx" : "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff0200e1f505000000001600141532e949bbb822a40663904b34bdb4a6326f618200e1f50500000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "d5f01ceebcf4b93f1391f0afa542e1822aeafc265282d0d7394e338d5c09d154",
+        "nonce" : "5e78bc137672332988e8b52e16ae2fc55c9eef3458c524294bb028070efb2628"
+      },
+      "contractInfo" : [ {
+        "preImage" : "2076676570806623143",
+        "outcome" : "7833ab29e8174973c07b6a6e0d6d8ed3d215c58387a5c9097c296385fe44ba0f",
+        "localPayout" : 62765625
+      }, {
+        "preImage" : "-4584218225950914765",
+        "outcome" : "07f2daa849798a55aabdd7fac9ffa9d70b40b5c2764c257f65fa916fd8563b9d",
+        "localPayout" : 71971251
+      }, {
+        "preImage" : "-5004681866969112874",
+        "outcome" : "7d0688dd20dec6ecacc332a8d40f2231a6fac759379f6724567fc76e631eb33a",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "5624571172014708739",
+        "outcome" : "8b41ade47414e9b297a145796c03291ea84ff8f629c5d8bda597b8de7de6a05c",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-4825975299734043269",
+        "outcome" : "b1876b811a6fb10bf4f19dab399c98b143f236366193088840ba296f80f98059",
+        "localPayout" : 195581877
+      }, {
+        "preImage" : "7365669815691055680",
+        "outcome" : "6705dd17f397fcc4d25e885350263e5eec4b47c3269081076eb7f964e07415c7",
+        "localPayout" : 21069228
+      }, {
+        "preImage" : "1458010264905361074",
+        "outcome" : "ff8d561b40fbe8c860f44112d169b4fa9b732559ea749a45f7366b603badc0b4",
+        "localPayout" : 55438035
+      }, {
+        "preImage" : "-5206417675885659052",
+        "outcome" : "e91c3f394d1c5519274e0301ff90a6684eafa29beb935fd4556d3eddc0567280",
+        "localPayout" : 150852983
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "6705dd17f397fcc4d25e885350263e5eec4b47c3269081076eb7f964e07415c7",
+      "oracleSignature" : "5e78bc137672332988e8b52e16ae2fc55c9eef3458c524294bb028070efb2628efebd6bbb254172330b26b3122a00f7319b0e234dc594a9671350aa2772507ab"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b8d5d463f013efe6cb58e33cba1de7c09b42055600000000",
+        "idx" : 0,
+        "inputKeys" : [ "3675c661d4dade73533475222c4b608f0276be7de05ff88e8d1a69edafb181e0" ],
+        "scriptWitness" : "020021022594e21257e3ff15a97e6453fb12d3983ac9375f75ecb31a8b2cd629a6952e3d",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qpl683u20uum94lexxjaed7k4c3k7p9z8786w7r",
+      "fundingPrivKey" : "c41df75b0675c45b184d6c954129cd25752adf9b1edaccfed96d954889b69e7e",
+      "payoutAddress" : "bcrt1qln507r7ds5e8wp2vf9wxrkjme9rmx5fjmc4j2f"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014aa8ff3ddb376b7032d69d70f41c7e49595e16db500000000",
+        "idx" : 0,
+        "inputKeys" : [ "4b3559c29d0b1f5cc4f61638e7b6ded66921afd96930a91d62f95073f4903c58" ],
+        "scriptWitness" : "02002103e34c2a857cec3478575cffde521a3e87883dd42fa9aa6cbd59498c355d58edb0",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qh36l9v3sdk4z83k0m8resgaxlvagulau0kfnrs",
+      "fundingPrivKey" : "b6446099c43d36ea382a5b8d03e8132a23e55ccf6c3496d9eadfadfb862f6591",
+      "payoutAddress" : "bcrt1qhz9nkqylg6xujzr0sjsd3nacdwn0883chcfkay"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000002343bec49cf86168bf7fee6093bd2311a5ac4b3f2d7c5f54511fa5e448e31408e0000000000ffffffffa0fbaa7f55ca5e94a4b7d18aa82d077544502a18ce31a175383fad69cea348c50000000000ffffffff0352c5eb0b00000000220020694b3fbb6a39b70d8a8a972967335af50877f4514e40db5c68fcacf59dd2c66ce1dcf505000000001600140ff478f14fe7365aff2634bb96fad5c46de09447e1dcf50500000000160014bc75f2b2306daa23c6cfd9c79823a6fb3a8e7fbc00000000",
+    "cets" : [ "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0239babd0300000000160014fce8ff0fcd853277054c495c61da5bc947b35132c7072e0800000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff02b3314a0400000000160014fce8ff0fcd853277054c495c61da5bc947b351324d90a10700000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0100c2eb0b00000000160014fce8ff0fcd853277054c495c61da5bc947b351320147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0100c2eb0b00000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff02b557a80b00000000160014fce8ff0fcd853277054c495c61da5bc947b351324b6a430000000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff02ac7d410100000000160014fce8ff0fcd853277054c495c61da5bc947b351325444aa0a00000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff02d3ea4d0300000000160014fce8ff0fcd853277054c495c61da5bc947b351322dd79d0800000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0277d5fd0800000000160014fce8ff0fcd853277054c495c61da5bc947b3513289eced0200000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000" ],
+    "refundTx" : "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0200e1f50500000000160014fce8ff0fcd853277054c495c61da5bc947b3513200e1f50500000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "d653d922cb34dec6fffc2098717c391ffdc80b928277928430f5dec972a21b2b",
+        "nonce" : "ffb83e40ae08865bd8083cebc24d1df4801e32f729315a825323b5d3718c3366"
+      },
+      "contractInfo" : [ {
+        "preImage" : "7631900657305541231",
+        "outcome" : "f228084d38881379646c1b90135b1cafec5405e72df140dacb9c90267477d617",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "8023966992817187513",
+        "outcome" : "4e7105f72a59e5a88b66de280214dd836f4d50bf3b9924327d14c744ec89676d",
+        "localPayout" : 142265665
+      }, {
+        "preImage" : "6393832948409354937",
+        "outcome" : "dc215822caf4ea91cc0c4f92342e09224dfdf02a1f18a8e8f965d525287886cb",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "4e7105f72a59e5a88b66de280214dd836f4d50bf3b9924327d14c744ec89676d",
+      "oracleSignature" : "ffb83e40ae08865bd8083cebc24d1df4801e32f729315a825323b5d3718c33669b5565aa4e1b56ee9d6da4ddc87e98eb3c2c0ac30dee1eb1386a8bb5b9550b73"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ed5a90596573bee762794e5558ab13bc7aeb104300000000",
+        "idx" : 0,
+        "inputKeys" : [ "4bd4c9c038c9c6ba02032b10bf0ad78fb2c1b9981bb8258a4c4d49c59ccf3760" ],
+        "scriptWitness" : "020021026617b0e87571c54366f03293f1e401dbb941a2cb1990a982669929615e16b86d",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qe7rvn8fe2g20fl55z3fd54txlugcys8sq5x0xs",
+      "fundingPrivKey" : "5f261ec3522b649aaab5b1d115167272d2d7d345d563f032095f607991511cb2",
+      "payoutAddress" : "bcrt1q7r0v48mcnwzh442a76hnftpvvkcpmlazg9nauk"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020d7212370090862192b4e40d32472aee3ed66d844653671700bf4ad55d8ea928300000000",
+        "idx" : 0,
+        "inputKeys" : [ "369ace68a8747d4f739dfedd90801654a7aa473f57ce59fecfe314233eddde9b", "b58d9b4ba08ec7fb19a612f0cb2d78a0a22fa07e078f722e3d5ce2c204c40b1b" ],
+        "scriptWitness" : "0147522103fccf58836e6b26a41f918ba71eedbceffb901e6b3cd7f4b744af0a415dad20d02103f2e5fd859f1c6f94dfa84d70411210edbb8fb7e8b684cbd0986a102f02411b0752ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q4q3phg7thw4jfawluaz3xdfme7tqaxwj3ta5rg",
+      "fundingPrivKey" : "3e7224f326e3fb4750f5aadf6f7b879ce7964691649048659b670d8d760e6836",
+      "payoutAddress" : "bcrt1qwwkuu3klct4n2tr9fg6f82vqjcswmv653zgyh6"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000002144d3c364ffb9d1f36388364e4ac0b808ca89612f1e882828f199f4c77dd16470000000000ffffffff78348a5d64f491cef6f3746893141a5c2cca69b81b37ae14f18e629d34d98d200000000000ffffffff0352c5eb0b00000000220020514894dd2d868e01c534e85536940f6457bfca01f6643737f42ab95fe8accd0ee1dcf50500000000160014cf86c99d395214f4fe941452da5566ff118240f055dcf50500000000160014a8221ba3cbbbab24f5dfe74513353bcf960e99d200000000",
+    "cets" : [ "020000000001014ee5171f6005284ac9469458080990c4147616e27e0674b3e4386906832b07e00000000000feffffff0100c2eb0b00000000160014f0deca9f789b857ad55df6af34ac2c65b01dffa2014752210298a28c9aa28d7b3d5e7b12f9ca912e72510358f9ce84bd6cb9345c597232e2d42103b97ced82e0b25dbf9334e820a965fdbd233df1231fa9ddfdb59e7955c6b3b9fe52ae64000000", "020000000001014ee5171f6005284ac9469458080990c4147616e27e0674b3e4386906832b07e00000000000feffffff0241cd7a0800000000160014f0deca9f789b857ad55df6af34ac2c65b01dffa2bff470030000000016001473adce46dfc2eb352c654a3493a9809620edb354014752210298a28c9aa28d7b3d5e7b12f9ca912e72510358f9ce84bd6cb9345c597232e2d42103b97ced82e0b25dbf9334e820a965fdbd233df1231fa9ddfdb59e7955c6b3b9fe52ae64000000", "020000000001014ee5171f6005284ac9469458080990c4147616e27e0674b3e4386906832b07e00000000000feffffff0100c2eb0b0000000016001473adce46dfc2eb352c654a3493a9809620edb354014752210298a28c9aa28d7b3d5e7b12f9ca912e72510358f9ce84bd6cb9345c597232e2d42103b97ced82e0b25dbf9334e820a965fdbd233df1231fa9ddfdb59e7955c6b3b9fe52ae64000000" ],
+    "refundTx" : "020000000001014ee5171f6005284ac9469458080990c4147616e27e0674b3e4386906832b07e00000000000feffffff0200e1f50500000000160014f0deca9f789b857ad55df6af34ac2c65b01dffa200e1f5050000000016001473adce46dfc2eb352c654a3493a9809620edb354014752210298a28c9aa28d7b3d5e7b12f9ca912e72510358f9ce84bd6cb9345c597232e2d42103b97ced82e0b25dbf9334e820a965fdbd233df1231fa9ddfdb59e7955c6b3b9fe52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "116479fceaa8125c5838cf970e58fdcfc5ccac9c6e7f1b7349e38b5c5720a102",
+        "nonce" : "9ba77d9e25e9d148eb29128f34f6acd054ea385a48f47d6480226228a0cfc1ef"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-8699234770448594327",
+        "outcome" : "b0af554afcab8ef5f78fc2f7e3a166ba90b083adfa534a4fbb6f2170089a0141",
+        "localPayout" : 160398403
+      }, {
+        "preImage" : "-5501605811668115912",
+        "outcome" : "60b2533db462537a95471c1b6bf2490083ae1341b75318c900c81ccf44509fcc",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "1663691386589006329",
+        "outcome" : "47443c2fa737de6d35c7eb968b8452f46d451db85bc8128909386cc74175e5e2",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "60b2533db462537a95471c1b6bf2490083ae1341b75318c900c81ccf44509fcc",
+      "oracleSignature" : "9ba77d9e25e9d148eb29128f34f6acd054ea385a48f47d6480226228a0cfc1ef3bc07a799d4814ccdd12531efdc0cf341d8bf2023a60f5967cde31fe0901f17a"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001426f319a023c976632cbcb2fb32cfef40b78e811200000000",
+        "idx" : 0,
+        "inputKeys" : [ "e7e2d3e3149478994ac0a8239811d4e8225e6c328a2e88151746b53ec24eb145" ],
+        "scriptWitness" : "02002103f314c8286842b36b5011f88a910b400f1a4a6eec1871942dd2a294514e210e23",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qtsv3ks4zr5muj4tlschq08x7cydvmrme5ssuja",
+      "fundingPrivKey" : "75703f8ab44f4ab4f839a23f4d05e682285e11ecc94c3916834104831a7f72e0",
+      "payoutAddress" : "bcrt1qq9sv4cd3g2p6srwqr7v6hwgjslwx6dukaj72f0"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ff195578bc029342b6fa317c8f82654b9462f7528700000000",
+        "idx" : 0,
+        "inputKeys" : [ "e9978b5bcd6eb4d835c8ef3f0307376a727fc1cd1d5775a7e9820cb86ad5eaf1", "66b656f3d7a652d7ae444f1443efc42751489809b554f2a91d2eb8f847a3a25a" ],
+        "redeemScript" : "002066a4e16d1ac28a73c08f0abccc6f523c5d8790ab24ea6cf011e00f51527dee43",
+        "scriptWitness" : "0147522103f691c4c0994e048ee2f3eefa04e82da78cc31fc6c14ac45b2865bce92ec47e1f2103ab58cde6bb56ed85b76a004e1f2617ffec7c9471c7537fdfb546c7ddcf8ee9e552ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qkmn5j3g9tsyl5sz0yhckkhp5x4ke0wz5meeegl",
+      "fundingPrivKey" : "f364e6e95164c8141f5235ac83953e5042bf38db5522b5cd3dbb51811577559f",
+      "payoutAddress" : "bcrt1qpnysyfxw2707t8frm0tr89nvzjutehalpfglhd"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000002bace664506a8941fe8a30dc589567ecd350c0813f682285d94cc0fffade91ae20000000000ffffffff20725907ab8ba38d280c8c3507b3c15bf78ddb2aaf3dc360beb52bcd1b7e868e000000002322002066a4e16d1ac28a73c08f0abccc6f523c5d8790ab24ea6cf011e00f51527dee43ffffffff0352c5eb0b00000000220020342de835b6523d50f58850b27b9cc29a1b9d1f01d75e3e30f892859632d2b6b3e1dcf505000000001600145c191b42a21d37c9557f862e079cdec11acd8f79a6dbf50500000000160014b6e74945055c09fa404f25f16b5c34356d97b85400000000",
+    "cets" : [ "020000000001012925ab00d81cea443059eb80d947d7ade2cc1dc8f069a29b8131a11dbaaa22af0000000000feffffff02437c8f09000000001600140160cae1b14283a80dc01f99abb91287dc6d3796bd455c02000000001600140cc90224ce579fe59d23dbd633966c14b8bcdfbf0147522103427935bb2ade9310c88b5d1bd604cd41ea7b8183439c30729ef1afa3ca5c6cc32103d20948d6eda0a47b53f313a76e1187d5d9c4dba42fb44858fa2e3e024f857deb52ae64000000", "020000000001012925ab00d81cea443059eb80d947d7ade2cc1dc8f069a29b8131a11dbaaa22af0000000000feffffff0100c2eb0b000000001600140160cae1b14283a80dc01f99abb91287dc6d37960147522103427935bb2ade9310c88b5d1bd604cd41ea7b8183439c30729ef1afa3ca5c6cc32103d20948d6eda0a47b53f313a76e1187d5d9c4dba42fb44858fa2e3e024f857deb52ae64000000", "020000000001012925ab00d81cea443059eb80d947d7ade2cc1dc8f069a29b8131a11dbaaa22af0000000000feffffff0100c2eb0b000000001600140cc90224ce579fe59d23dbd633966c14b8bcdfbf0147522103427935bb2ade9310c88b5d1bd604cd41ea7b8183439c30729ef1afa3ca5c6cc32103d20948d6eda0a47b53f313a76e1187d5d9c4dba42fb44858fa2e3e024f857deb52ae64000000" ],
+    "refundTx" : "020000000001012925ab00d81cea443059eb80d947d7ade2cc1dc8f069a29b8131a11dbaaa22af0000000000feffffff0200e1f505000000001600140160cae1b14283a80dc01f99abb91287dc6d379600e1f505000000001600140cc90224ce579fe59d23dbd633966c14b8bcdfbf0147522103427935bb2ade9310c88b5d1bd604cd41ea7b8183439c30729ef1afa3ca5c6cc32103d20948d6eda0a47b53f313a76e1187d5d9c4dba42fb44858fa2e3e024f857deb52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "2e47826381204b48aa52b3b9031ba05ec4a6f79c31ad904721ffd73dfb9db736",
+        "nonce" : "10bd7a9b3e37d0e674daf1ce0145c66e643ad2bfb601a66e71cc19e2de33b95c"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-5022698024122430856",
+        "outcome" : "91fa0bf2dbe58e490c8e66eda7a09aae4d3b92f3afb49b33699dfe85232d8426",
+        "localPayout" : 114977017
+      }, {
+        "preImage" : "-9109724228812523165",
+        "outcome" : "472eb657f0eec3b31d08de7d2c616d8c0e758b5c49557b584d9aa824c36a24b5",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-3905123686520536138",
+        "outcome" : "93266d9928fafaea36aef42e0a60c58e38af745864764b7ed64c2c2549ebcdfa",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "472eb657f0eec3b31d08de7d2c616d8c0e758b5c49557b584d9aa824c36a24b5",
+      "oracleSignature" : "10bd7a9b3e37d0e674daf1ce0145c66e643ad2bfb601a66e71cc19e2de33b95cf8a6095be1cce5ab1ab2f871808110a83b6ba7968ef1c4747e81afd0f57a75e6"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ee218e39f0d782f37dc136032ba88cd455efbc502c89228727505068a8a6759400000000",
+        "idx" : 0,
+        "inputKeys" : [ "36ae899c4bd1b7b75dd43509cfb44c17d12089092a0b48bfe7302d3a1223c521", "d4fecba8339d66431dad1c979683ca11455f845e9ec7503a778f02c493f1126e" ],
+        "scriptWitness" : "014752210322c23e183a41568cb6c962627c61cde583fe8b5c042475ce0f9de0dbf839b7672103af604692e1d6946f03886f3b1a6c7700a1373d8606cbc06733f9e9f7706049ea52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qlmk3uxhfw0mutleje3nfmwlg62e42afqanrtxn",
+      "fundingPrivKey" : "783e649f8c45c84dd14b414a724e070be9e290d62d54cd36977b6b72fb77878a",
+      "payoutAddress" : "bcrt1q9srkh39v5sffn33h9gwzma2rrx5zvq7f9ze3gt"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014622bc990ccdd17b628c8f4c1d73d156cdd4efb9400000000",
+        "idx" : 0,
+        "inputKeys" : [ "4f8db41d748de418bfc1467ba33fb1415e11436358d22ec9fee45b7cff1de18c" ],
+        "scriptWitness" : "020021037abe91043024a1a295c43ce38cd8adbfbe9c673e25699d19befce21064bd36ea",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qh2yqekmhnl0tdmupvv4tx5j5l5lwvuc9ex05wr",
+      "fundingPrivKey" : "095abd0bbd827b55e3b744cabcc1840675cd8ef861e600a9360f2872609c0661",
+      "payoutAddress" : "bcrt1qy3rhhdx4ssdafqf4j4l9a0slqtq5v74ae8yue2"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000002cbcbfa44997b9aca00a908c9c9b984b487cffde2e10d833bee2f7b71fd1c722c0000000000ffffffff6ad59deb0745948dc2dc293581b953be37fcddff6236765a97be1f864d10edd50000000000ffffffff0352c5eb0b00000000220020b634d8a04ed3e69e23592a40f0d30a5dc1f8376ea57ef6a10423ffd896178c6455dcf50500000000160014feed1e1ae973f7c5ff32cc669dbbe8d2b3557520e1dcf50500000000160014ba880cdb779fdeb6ef81632ab35254fd3ee6730500000000",
+    "cets" : [ "020000000001011f1ebe082e76966fd44f47cfb83d8d991b1561bc0837cc534167c126d07555770000000000feffffff02f968da06000000001600142c076bc4aca41299c6372a1c2df54319a82603c9075911050000000016001424477bb4d5841bd48135957e5ebe1f02c1467abd0147522102db4ba9f9201dd401b192ff6b6f652269b35ae23c3225547948c63a9d780a24662102f61d8ab33b62f2642491b2b5ed71942a522ebc6315e90a8f02f4da7321a5397e52ae64000000", "020000000001011f1ebe082e76966fd44f47cfb83d8d991b1561bc0837cc534167c126d07555770000000000feffffff0100c2eb0b0000000016001424477bb4d5841bd48135957e5ebe1f02c1467abd0147522102db4ba9f9201dd401b192ff6b6f652269b35ae23c3225547948c63a9d780a24662102f61d8ab33b62f2642491b2b5ed71942a522ebc6315e90a8f02f4da7321a5397e52ae64000000", "020000000001011f1ebe082e76966fd44f47cfb83d8d991b1561bc0837cc534167c126d07555770000000000feffffff0100c2eb0b000000001600142c076bc4aca41299c6372a1c2df54319a82603c90147522102db4ba9f9201dd401b192ff6b6f652269b35ae23c3225547948c63a9d780a24662102f61d8ab33b62f2642491b2b5ed71942a522ebc6315e90a8f02f4da7321a5397e52ae64000000" ],
+    "refundTx" : "020000000001011f1ebe082e76966fd44f47cfb83d8d991b1561bc0837cc534167c126d07555770000000000feffffff0200e1f505000000001600142c076bc4aca41299c6372a1c2df54319a82603c900e1f5050000000016001424477bb4d5841bd48135957e5ebe1f02c1467abd0147522102db4ba9f9201dd401b192ff6b6f652269b35ae23c3225547948c63a9d780a24662102f61d8ab33b62f2642491b2b5ed71942a522ebc6315e90a8f02f4da7321a5397e52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "4daac61d88197d6817671d47d228c8c5ae95fd146aa802af9042fdf586dcf51a",
+        "nonce" : "7551570262f5cbc492337ed9072e6c83d292d4b08a0c85380f7fbca428ca7417"
+      },
+      "contractInfo" : [ {
+        "preImage" : "7343396950470698908",
+        "outcome" : "1993b051d11fef552d09efbb18773b6e35de8f7dd577080f9fd25d68c8fc16d9",
+        "localPayout" : 126847988
+      }, {
+        "preImage" : "5063277641255111107",
+        "outcome" : "abbe9b579c6026c17b7a88bf705c670bd83792b936d3992dd69bafe9e165df1c",
+        "localPayout" : 0
+      }, {
+        "preImage" : "188040828025985198",
+        "outcome" : "d17bd6901aaf43f29be0a91dc5c43cb44d9997c3f14a9b36436ff1198901b1b9",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "abbe9b579c6026c17b7a88bf705c670bd83792b936d3992dd69bafe9e165df1c",
+      "oracleSignature" : "7551570262f5cbc492337ed9072e6c83d292d4b08a0c85380f7fbca428ca74174d788eb7482764d662aba16ad9ef652b633c1b78b4d5a14a2a31b48598aba78e"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020b62d136c540e04148f673f167b22c702b6aa5555fed18621dbbf171e1a4f33f600000000",
+        "idx" : 0,
+        "inputKeys" : [ "8c278e30bfac47ed1b6f263a1b9ca3174e11650399c9f8c3097ae002db436073", "2e96ad551487f320d6d57987916ec2c06fbad8254533fb901468983c5e4c33f6" ],
+        "scriptWitness" : "0147522102ae476d016dd4dee4aaab5836f5c43bd65d2242ce77b963f274f46535c55a795c21035d341f860faaeddb8f2a6f2982b7fa07dbb8f96a3f8f1370df8b8e5ef121bc2452ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q0rt4g6dqu0l8nc9nmhy5g74dhfr9707w54fj4h",
+      "fundingPrivKey" : "7f47e2885fff05e893a2a449d50034100186a9e6aa97dcb7a725faf20a5e2e8f",
+      "payoutAddress" : "bcrt1qtgefw9entmyfeg2t5c99f48tmgy0xw4hp0jge9"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002090e01eb12abac099978f6256328ec7555e54fbbaf8d5ed17fee071ffb51b6e5e00000000",
+        "idx" : 0,
+        "inputKeys" : [ "37257b3acb49573a9729d34d62d55cb24478a4f1e2ef3c0dc8f83cd078a185d6", "9a9ebc527a71acfb010b8ac5d383d81669007397a388444c34e38ff1da685935" ],
+        "scriptWitness" : "014752210388afa14b5d0f8d1e4115a4e6e10fe137a723fffbb2ee954b2c270a1c14349d70210373b354c686732d302c1fd09fb19f97c7a7922f0bd882c79f551930805b59bd4152ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qe6v47jdm6leeyp2cnm5sysyws27hv6pl49yjrq",
+      "fundingPrivKey" : "666a874c0431e4c0ce4e3ce8def1667771d5e696c87602fe769152a56fb3751a",
+      "payoutAddress" : "bcrt1qgv9v82c72y4ny47pu40whlndqvev86a9hesm8q"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "02000000020639144f33ee539398d0819c4a341b766ad96b71e59bd910b20a54f386265ab40000000000ffffffff6d05a9cd32f75f02961c85dcd4b98c8170344bd7abf925bddf6c51cba75ff4fb0000000000ffffffff0352c5eb0b00000000220020537d86da4fb293aa2d1899f0d211f76211df942ae7773109f89b57eb5e0e203d55dcf5050000000016001478d75469a0e3fe79e0b3ddc9447aadba465f3fce55dcf50500000000160014ce995f49bbd7f39205589ee902408e82bd76683f00000000",
+    "cets" : [ "02000000000101c749bf0626f7cac25118019c62aaf2584e62c14b7d1aac7b4350bc76a0897f9a0000000000feffffff02f48b8f07000000001600145a329717335ec89ca14ba60a54d4ebda08f33ab70c365c0400000000160014430ac3ab1e512b3257c1e55eebfe6d0332c3eba5014752210254113ca54adcef44aced823d5b25d99f01307423ff0e7f6f419b8decbab4010c21029aa373aaa52b413561b954ebf03209118be149e68f8621dd20eae1f6119c77bb52ae64000000", "02000000000101c749bf0626f7cac25118019c62aaf2584e62c14b7d1aac7b4350bc76a0897f9a0000000000feffffff0100c2eb0b00000000160014430ac3ab1e512b3257c1e55eebfe6d0332c3eba5014752210254113ca54adcef44aced823d5b25d99f01307423ff0e7f6f419b8decbab4010c21029aa373aaa52b413561b954ebf03209118be149e68f8621dd20eae1f6119c77bb52ae64000000", "02000000000101c749bf0626f7cac25118019c62aaf2584e62c14b7d1aac7b4350bc76a0897f9a0000000000feffffff0100c2eb0b000000001600145a329717335ec89ca14ba60a54d4ebda08f33ab7014752210254113ca54adcef44aced823d5b25d99f01307423ff0e7f6f419b8decbab4010c21029aa373aaa52b413561b954ebf03209118be149e68f8621dd20eae1f6119c77bb52ae64000000" ],
+    "refundTx" : "02000000000101c749bf0626f7cac25118019c62aaf2584e62c14b7d1aac7b4350bc76a0897f9a0000000000feffffff0200e1f505000000001600145a329717335ec89ca14ba60a54d4ebda08f33ab700e1f50500000000160014430ac3ab1e512b3257c1e55eebfe6d0332c3eba5014752210254113ca54adcef44aced823d5b25d99f01307423ff0e7f6f419b8decbab4010c21029aa373aaa52b413561b954ebf03209118be149e68f8621dd20eae1f6119c77bb52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "4243769e10d6cfa4c8d74f2716df03611da16882628c5f6ac7c8381e35c31a72",
+        "nonce" : "31c31c72cc3f076f696bbd5e45d261c2a9943a3977b6fa4977a7dbd0f090527b"
+      },
+      "contractInfo" : [ {
+        "preImage" : "1384705059680254057",
+        "outcome" : "a505dd32c9c8ea8dc32cc310795732769dcdad8a9c3e35f0db871b893a85022b",
+        "localPayout" : 130826147
+      }, {
+        "preImage" : "-2787378124336014564",
+        "outcome" : "c9c78caa337ba70e4887972b6d3ce26adc5e91e176fc9a7d60cfe0b01065fdfe",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-1154462628261842555",
+        "outcome" : "61762e94dfb0d1c5de0c425d6650f758fed3dcc3aa724afdf15d9aeac9116864",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "c9c78caa337ba70e4887972b6d3ce26adc5e91e176fc9a7d60cfe0b01065fdfe",
+      "oracleSignature" : "31c31c72cc3f076f696bbd5e45d261c2a9943a3977b6fa4977a7dbd0f090527be15102b0aaba3e006ac36743461e9a0fe852da3475d9b5a45ebd04cbee486a26"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200204eff971df2a1c65e583ab8c611d84b0cf97e0dec8cb7941c7b9558ba241463e200000000",
+        "idx" : 0,
+        "inputKeys" : [ "ea8ee9687e5a43553e60d53a50bb15488417aaa97c0cacdbe18ad9072e175066", "d64f77967332a309d5cba21f629df1de00c7ab6cbfdf778a0a4bc205821a0995" ],
+        "scriptWitness" : "014752210357c06a0e2236f06c0004499750bec34a4e80d15625103ba27905b33647a5b16621024eb265c00ced7551e68845f28a329625aab8f7c75b8dca59a5e8342d4a29c3c752ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qp0rrfz7s8aem637uhe2qv4jwrtqj5macvhkvpr",
+      "fundingPrivKey" : "6eec1c965ba1d4c37dace6ed17dbce6ebb8c2fc71e2fb589cde1773c4dfb5749",
+      "payoutAddress" : "bcrt1qvuymkxgpyqjaqgmcqnujjm2qfxvej29uuguwfx"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ce62f6df5280c1ef634472d4e11ee5386861895e8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "2014c3326ddb437ea5752daadf4dbedb446b98eeccceff9de7e6484f725d3206", "b598058f126cd9486644e3d32fc424049c6fdb22ff2a4f5cee2f4ed21d119059" ],
+        "redeemScript" : "0020975bc0f2cefae1303897b20581e58f197199198a436d5148d1e625f25d8c2d2e",
+        "scriptWitness" : "0147522102d4bdadd0adbd21029a3acfa26a512ef47d560f1002f931abafcb7c5d50f06e28210331a70df9017be103a82f82248a23d9619d35d54faaf1a5c8329532c983d24f8252ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qy09vuvp8m97ypqra9f5q3uf3nklnl0jv74cl5m",
+      "fundingPrivKey" : "dfc62a1863c5cd8c0444f039def010dc33fc3ef028477a666ea85332542e2295",
+      "payoutAddress" : "bcrt1q7j250qn8a26rr7puywrp9yrcgyy2jrn4hyfp3p"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000002b2dda409b538ff0884f955497921a57f40805037f7e46b0044ebf5a0463a7d480000000000ffffffff247917f8f6df28998fd17e14d43eedbcba449077473f4cfb66d201ecb02ae2c80000000023220020975bc0f2cefae1303897b20581e58f197199198a436d5148d1e625f25d8c2d2effffffff0352c5eb0b00000000220020c0cd4f69998f123ad23700324ef2db1cffed7b353ef6d49360d86a2484a55ff055dcf505000000001600140bc6348bd03f73bd47dcbe5406564e1ac12a6fb8a6dbf5050000000016001423cace3027d97c40807d2a6808f1319dbf3fbe4c00000000",
+    "cets" : [ "02000000000101892c570f57cb6453e2b81f06a15dbb0f80ad76a49c857f0df3f36274333563fe0000000000feffffff02a33fcc07000000001600146709bb19012025d0237804f9296d4049999928bc5d821f0400000000160014f495478267eab431f83c23861290784108a90e7501475221028914b347f19a07cfec76a4fc5a8711f6b9d2f599db3107d7ca2520d34afa44ed2102cdddc19a318193e7cff2a57796d1ed026943c2213ca467e0c277a0dc81f6211e52ae64000000", "02000000000101892c570f57cb6453e2b81f06a15dbb0f80ad76a49c857f0df3f36274333563fe0000000000feffffff0100c2eb0b00000000160014f495478267eab431f83c23861290784108a90e7501475221028914b347f19a07cfec76a4fc5a8711f6b9d2f599db3107d7ca2520d34afa44ed2102cdddc19a318193e7cff2a57796d1ed026943c2213ca467e0c277a0dc81f6211e52ae64000000", "02000000000101892c570f57cb6453e2b81f06a15dbb0f80ad76a49c857f0df3f36274333563fe0000000000feffffff0100c2eb0b000000001600146709bb19012025d0237804f9296d4049999928bc01475221028914b347f19a07cfec76a4fc5a8711f6b9d2f599db3107d7ca2520d34afa44ed2102cdddc19a318193e7cff2a57796d1ed026943c2213ca467e0c277a0dc81f6211e52ae64000000" ],
+    "refundTx" : "02000000000101892c570f57cb6453e2b81f06a15dbb0f80ad76a49c857f0df3f36274333563fe0000000000feffffff0200e1f505000000001600146709bb19012025d0237804f9296d4049999928bc00e1f50500000000160014f495478267eab431f83c23861290784108a90e7501475221028914b347f19a07cfec76a4fc5a8711f6b9d2f599db3107d7ca2520d34afa44ed2102cdddc19a318193e7cff2a57796d1ed026943c2213ca467e0c277a0dc81f6211e52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "f33cfed40169977cc2c1e8f3b75b897ab3b0a0ffc4eeea18b4bb36501b05a8fa",
+        "nonce" : "178b6207035d1cd2aef930a77fb86aeef571d4fe2ce0d3d946a65742e7c79ddb"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-8995151701377482240",
+        "outcome" : "d49b9cfa8879203b67a206f02f0225d199735b2be070e4faf4a2795d5a26acf1",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-1854830731646103122",
+        "outcome" : "55f72456d4a0a1627eca5cc59e828687abe6b08387c68500f7a84d31af172452",
+        "localPayout" : 0
+      }, {
+        "preImage" : "5821248891314283074",
+        "outcome" : "4575a0dc910f2550025f0f042f8ecd74e82f0e577359db41fe40d68a9532b689",
+        "localPayout" : 191982543
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "55f72456d4a0a1627eca5cc59e828687abe6b08387c68500f7a84d31af172452",
+      "oracleSignature" : "178b6207035d1cd2aef930a77fb86aeef571d4fe2ce0d3d946a65742e7c79ddb895d64c69e2d61ae95efc380fdec03e15cb9a2ee495ab90f53a4e0762b2b0c46"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ef5accaf9394fe15688e1a98744594572ee165498700000000",
+        "idx" : 0,
+        "inputKeys" : [ "0e1d5b27ba9752fbea80d2e66adbcf1247291a65eba9d25caf621fc5ee794572", "d8474d30731d936fb1feba42aafa243e2c124b473d6ab5017f860a980fb60dfd" ],
+        "redeemScript" : "002060516992e32dc018ba540cf8614ddabd034fa3cc80ec221d7864951289b0843f",
+        "scriptWitness" : "014752210213437466a7de61bde814e2e240260799e267f2504065f48bf590c8547e3c804221033018195736197ba3d47de82a00d376e4f50f4bb51e55e849a49d0f350db34e5852ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q7tnuud6fkz8w7q8p9fgtp6uzgghj4qcetcwmcz",
+      "fundingPrivKey" : "2cc33a7b9146f7c66d09838d5a7fe06bb8c438613997f88a398a3f4dc88043c8",
+      "payoutAddress" : "bcrt1qxuf7ssc4l26vzgprawvayzyxxw4vfk5wxusc06"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600142efd5edaa7fb7264b3ad8d7ba9806fa247d00b1b00000000",
+        "idx" : 0,
+        "inputKeys" : [ "7b7d53c9b272bb7fdc761e996bddf65c91ad1922039e9fd32be83fadc23eb6e2" ],
+        "scriptWitness" : "02002102acd05b54379d171327589e2894ad98a94754861c2f286dc881e97dfac6164d3e",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qkeuksrj2pvkt4g5y3tr6tcca2gg287vvpvegnr",
+      "fundingPrivKey" : "0583d99d99161e3c0c1811f50d7de35d3f11964bf3b263b2761c7b0785225706",
+      "payoutAddress" : "bcrt1qmm4fcmclm6zgvxw060fstcdlq36qv338qv77hy"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "020000000218ff72055e66190f416653b874a2a65e0ab0a462a8d717eafa5b88fbd3e7fc62000000002322002060516992e32dc018ba540cf8614ddabd034fa3cc80ec221d7864951289b0843fffffffff660784b871d2232edcbed834f57f4c6231c8d3e4cb2f06ccf1a9ffa61ae6e3930000000000ffffffff0352c5eb0b00000000220020509fbafd246b5ad5fec0b7c21639cc8d99ee7aa68f422e3ab481a0813373db3aa6dbf50500000000160014f2e7ce3749b08eef00e12a50b0eb82422f2a8319e1dcf50500000000160014b679680e4a0b2cbaa2848ac7a5e31d5210a3f98c00000000",
+    "cets" : [ "02000000000101217d0aaee21ba9ff3aaf9c6fad3675aab663d727f9b67fc089a8c8841895370b0000000000feffffff0100c2eb0b000000001600143713e84315fab4c12023eb99d2088633aac4da8e0147522102a8bbf918aa6498ae8ff9f14972847f6c9fff8f26543b82028a08ff69c7ebc2682103ddb89b39ee3a9b8c25fb1272cc54f6c2df1a25086a9d472137001af6ef98d7d152ae64000000", "02000000000101217d0aaee21ba9ff3aaf9c6fad3675aab663d727f9b67fc089a8c8841895370b0000000000feffffff0100c2eb0b00000000160014deea9c6f1fde848619cfd3d305e1bf04740646270147522102a8bbf918aa6498ae8ff9f14972847f6c9fff8f26543b82028a08ff69c7ebc2682103ddb89b39ee3a9b8c25fb1272cc54f6c2df1a25086a9d472137001af6ef98d7d152ae64000000", "02000000000101217d0aaee21ba9ff3aaf9c6fad3675aab663d727f9b67fc089a8c8841895370b0000000000feffffff02cf6b710b000000001600143713e84315fab4c12023eb99d2088633aac4da8e31567a0000000000160014deea9c6f1fde848619cfd3d305e1bf04740646270147522102a8bbf918aa6498ae8ff9f14972847f6c9fff8f26543b82028a08ff69c7ebc2682103ddb89b39ee3a9b8c25fb1272cc54f6c2df1a25086a9d472137001af6ef98d7d152ae64000000" ],
+    "refundTx" : "02000000000101217d0aaee21ba9ff3aaf9c6fad3675aab663d727f9b67fc089a8c8841895370b0000000000feffffff0200e1f505000000001600143713e84315fab4c12023eb99d2088633aac4da8e00e1f50500000000160014deea9c6f1fde848619cfd3d305e1bf04740646270147522102a8bbf918aa6498ae8ff9f14972847f6c9fff8f26543b82028a08ff69c7ebc2682103ddb89b39ee3a9b8c25fb1272cc54f6c2df1a25086a9d472137001af6ef98d7d152aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "0720999ec40c81d7400b7286466703e758c3a13023944a73390f97c1837a091e",
+        "nonce" : "87ab80b38d37112086c3d8a3bb9f7f7b7a1490167d495d9399bc26d4e91e8e31"
+      },
+      "contractInfo" : [ {
+        "preImage" : "8469552611251101686",
+        "outcome" : "4832d2338025fd91afbd22fbc40eb1796287eac59f4a915395dbfff05f6dce9a",
+        "localPayout" : 159071262
+      }, {
+        "preImage" : "-4028593065698166533",
+        "outcome" : "5c74de0430471d16ee3bc56674cc2b6e6b24256b14b5f1e0112531095cf9d99f",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-4584213225836449497",
+        "outcome" : "9bf755be70086ad6e0a9d66b6f8800b9e160fab2a8c6764ac199247eb1a44f3b",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "5c74de0430471d16ee3bc56674cc2b6e6b24256b14b5f1e0112531095cf9d99f",
+      "oracleSignature" : "87ab80b38d37112086c3d8a3bb9f7f7b7a1490167d495d9399bc26d4e91e8e31cf3ebaef643957b423bbc938467dd3450eceee6ae742164f61845f0a83ec8106"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9144cc3f31ae807e93d905ec013348d3641fc3f402b8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "39467ff937f136816bebf0aeb03849b15ab91118bb1e3058e1fccd354134be3c", "99bca8c61ca2e28fbf6d706a444f18ac6a493dedecd169b21a5951ccdf750828" ],
+        "redeemScript" : "0020ba02af941998457dce68b8ecd3bde6ba95f77a49c597e26cd34510b4d675c661",
+        "scriptWitness" : "0147522103dabe66ec3cbbb97894435c0c379db21835fe6e904c595effc7667821f91215d921030e5823725c5ab205fb89540ee78dd7e9a4e705bb1276f3b19724c915b4c28b5452ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qxf9a09sj4uylrv050hmlw8xqqf8exfcad7xs7l",
+      "fundingPrivKey" : "296c999aeda13458babc304f1f30dc563a27db64d0e1f82ef5ae688d605ff69a",
+      "payoutAddress" : "bcrt1q22smlduhex7xgx00y5nux8ulaeeh27rkkpt77n"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ceb44e921cc670250fe65398ae1a507cb0f7522bde85249f66e535a08489bb8f00000000",
+        "idx" : 0,
+        "inputKeys" : [ "c584936d7c338f10f7d23e8e15b4d0970fbe2d62582c80626af9c69f7052e83b", "a284220a8b83b718c7bf2ae3b7298850d8a18224ff1f0947496189ccb6e399a6" ],
+        "scriptWitness" : "0147522102cabb8efdcddb0545cf8a7b24d86b5d208a9f76b5873592d0a76950666e667b342102f9d519d9d56e54f75bf5854c8b5c1d20b35ccd43e65e3373f2a98a0fa944a94e52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qp2g2cxz0hupf3nngl92yx6nnndsdqmgfvysags",
+      "fundingPrivKey" : "88c1fc088375aad9036d0c753dc27379b7d93f70d333f25630b9151a7ca34f49",
+      "payoutAddress" : "bcrt1qyl9650w9teq55vtvxmmjsjg25r04wvd554zgl3"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000002dc095645c0a20bca5da8dffcb979c38568bdae8c56612de557e99b966332a5180000000023220020ba02af941998457dce68b8ecd3bde6ba95f77a49c597e26cd34510b4d675c661ffffffff1cee9dacf7def1045676b7a625bd6d05fa989fdebc3cedb5ffcaaac448a5ce7a0000000000ffffffff0352c5eb0b00000000220020b04dd607aa6a6f0001efbbc68c64a3d6f901ca7cd387f73f8b14d22f46c5006fa6dbf50500000000160014324bd79612af09f1b1f47df7f71cc0024f93271d55dcf505000000001600140a90ac184fbf0298ce68f954436a739b60d06d0900000000",
+    "cets" : [ "02000000000101d73da7e14a778992a4ae84d512bc8cb8df81e61379333cf8f503d5a3e0a0906a0000000000feffffff021e3c7b090000000016001452a1bfb797c9bc6419ef2527c31f9fee73757876e28570020000000016001427cbaa3dc55e414a316c36f728490aa0df5731b401475221030b886f02a60c9b5f5145b06d987e71dd2063792e9a20da121db7b65be3bb7ca52103f0423472992b34d1689e2b9ce287ff8a6ecbd1f99fb2405f779cf4365cb2860c52ae64000000", "02000000000101d73da7e14a778992a4ae84d512bc8cb8df81e61379333cf8f503d5a3e0a0906a0000000000feffffff0100c2eb0b0000000016001427cbaa3dc55e414a316c36f728490aa0df5731b401475221030b886f02a60c9b5f5145b06d987e71dd2063792e9a20da121db7b65be3bb7ca52103f0423472992b34d1689e2b9ce287ff8a6ecbd1f99fb2405f779cf4365cb2860c52ae64000000", "02000000000101d73da7e14a778992a4ae84d512bc8cb8df81e61379333cf8f503d5a3e0a0906a0000000000feffffff0100c2eb0b0000000016001452a1bfb797c9bc6419ef2527c31f9fee7375787601475221030b886f02a60c9b5f5145b06d987e71dd2063792e9a20da121db7b65be3bb7ca52103f0423472992b34d1689e2b9ce287ff8a6ecbd1f99fb2405f779cf4365cb2860c52ae64000000" ],
+    "refundTx" : "02000000000101d73da7e14a778992a4ae84d512bc8cb8df81e61379333cf8f503d5a3e0a0906a0000000000feffffff0200e1f5050000000016001452a1bfb797c9bc6419ef2527c31f9fee7375787600e1f5050000000016001427cbaa3dc55e414a316c36f728490aa0df5731b401475221030b886f02a60c9b5f5145b06d987e71dd2063792e9a20da121db7b65be3bb7ca52103f0423472992b34d1689e2b9ce287ff8a6ecbd1f99fb2405f779cf4365cb2860c52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "c947b9d9d33bf712390822fafc7ccf65e474378d5bbea477e1c434311d18ee43",
+        "nonce" : "84d720e380f8a788fb69f45b7d77f005231d30ff94990b21e1d26241cf62589b"
+      },
+      "contractInfo" : [ {
+        "preImage" : "7216759102276770250",
+        "outcome" : "3dc4eba950c8a4d6e5a2a4f47324e295a6f14574e4b2368b9a99ade942f0374f",
+        "localPayout" : 0
+      }, {
+        "preImage" : "286554657180017357",
+        "outcome" : "6377106f5a515438cad350bf8a948e2322d02b4d26634dc6a9f34dc316168df3",
+        "localPayout" : 157140129
+      }, {
+        "preImage" : "-917667172428359157",
+        "outcome" : "442c2bf862781fc3401cedcca96b71e33c4c0ecd78b0f3632bfec3defbd31b59",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "6377106f5a515438cad350bf8a948e2322d02b4d26634dc6a9f34dc316168df3",
+      "oracleSignature" : "84d720e380f8a788fb69f45b7d77f005231d30ff94990b21e1d26241cf62589b09ec0ffe0d5e472a7a692b6804c5396c4814722243b0030907fd819807453fb2"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9147ee9d25f6209606e970a9ee99b871100e42e88018700000000",
+        "idx" : 0,
+        "inputKeys" : [ "49aef4e2ca544156a6a1da50090dde2867e45fd90cbd5ac9308e2f8d54b1d407", "a3a849bbd2b8390a44faf607b5f3b85441a05d3f962b6c5d3464025a0bd9fd0b" ],
+        "redeemScript" : "00206d1aae7aa202761f7edcf09d36f54ce02c380e20d42165ed82bb842ebd32fa70",
+        "scriptWitness" : "0147522103bec8b1032114326715cf6884e2f8fe229deedb8a1e2ca9bfc3d9d1153ccbfce5210312031dba875fd42bd86e2e02806bf3e7107a9188f86bb7978001bb80805b705652ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qve4twdznql8sgza5he7ravdc383dyq9cwkf922",
+      "fundingPrivKey" : "9afc0af152847be982a97b3b3173ab6ace837b4895048a44f31dd45ee58afd2b",
+      "payoutAddress" : "bcrt1qehj9gg8mlprruwgvhwt5c8u3vmduf9lqgh3vua"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9142d2ae09b908cb69a9337f7fb8d4c0e2bccd7b6da8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "4889c5619315a9d966b1c63cf9df1795d62df885ca6452f433b59d68cb04df12", "fe8047651abb5caf46a8f31acb15c0ccc8bdef92a7a060631278a5bc89bbdcb8" ],
+        "redeemScript" : "002030b7fbc4f8b178db74fcedcde4b3be841e93badb794ab73d6a08511439a24e4e",
+        "scriptWitness" : "014752210366a0f55caebb7bf32ecff21f0a089cbf7525f9f6985283068798993b3ded90562102b56cbc26796155dc22e8c783b08c4977966b67affc527fa62555bde5db2e055252ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1quj3tfavl32jqhca78c0grfny4ddeeykewvmhzu",
+      "fundingPrivKey" : "c795953b58025baeae523670339b08795c08698458813bcd0e36560cb7d7365a",
+      "payoutAddress" : "bcrt1qt5pe8adxdq39sjqeg44kx80duz5gdua7rzslpx"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "02000000021e048b5c7d1dcc87529b2ad4b48c0b87450d857dc8e91fa6d586e7ca8279ea9800000000232200206d1aae7aa202761f7edcf09d36f54ce02c380e20d42165ed82bb842ebd32fa70ffffffffd2945579193609785579fe3c4b97f724ead6904b42b0c76db6e02881c06d379c000000002322002030b7fbc4f8b178db74fcedcde4b3be841e93badb794ab73d6a08511439a24e4effffffff0352c5eb0b0000000022002020981e2479bc92f4ca1bbb9afc5bebcb81834f3572c489482e4f1250d16623a4a6dbf50500000000160014666ab7345307cf040bb4be7c3eb1b889e2d200b8a6dbf50500000000160014e4a2b4f59f8aa40be3be3e1e81a664ab5b9c92d900000000",
+    "cets" : [ "02000000000101d002515bc51225d2ee27c1c7dd8b2f6a8692883cc1ffdb21f77cf799a9a33e680000000000feffffff0100c2eb0b000000001600145d0393f5a66822584819456b631dede0a886f3be0147522102a5c69d9540124dbf73122707d09dbfe2735ae6167e73681a925d74a185dca4872102b5193575017432d0d74253250d8837aa6ff7e52d1bb263490620f9ff70a18d3752ae64000000", "02000000000101d002515bc51225d2ee27c1c7dd8b2f6a8692883cc1ffdb21f77cf799a9a33e680000000000feffffff02a1c45d0900000000160014cde45420fbf8463e390cbb974c1f9166dbc497e05ffd8d02000000001600145d0393f5a66822584819456b631dede0a886f3be0147522102a5c69d9540124dbf73122707d09dbfe2735ae6167e73681a925d74a185dca4872102b5193575017432d0d74253250d8837aa6ff7e52d1bb263490620f9ff70a18d3752ae64000000", "02000000000101d002515bc51225d2ee27c1c7dd8b2f6a8692883cc1ffdb21f77cf799a9a33e680000000000feffffff0100c2eb0b00000000160014cde45420fbf8463e390cbb974c1f9166dbc497e00147522102a5c69d9540124dbf73122707d09dbfe2735ae6167e73681a925d74a185dca4872102b5193575017432d0d74253250d8837aa6ff7e52d1bb263490620f9ff70a18d3752ae64000000" ],
+    "refundTx" : "02000000000101d002515bc51225d2ee27c1c7dd8b2f6a8692883cc1ffdb21f77cf799a9a33e680000000000feffffff0200e1f50500000000160014cde45420fbf8463e390cbb974c1f9166dbc497e000e1f505000000001600145d0393f5a66822584819456b631dede0a886f3be0147522102a5c69d9540124dbf73122707d09dbfe2735ae6167e73681a925d74a185dca4872102b5193575017432d0d74253250d8837aa6ff7e52d1bb263490620f9ff70a18d3752aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "d58777f414ea2791a9452d4994d5e7fa2e0bc4f0052b78e13c804c0da2f97e58",
+        "nonce" : "fc2a0b9d24c6f9fd72b1eca48079cbfb9b8323c62099906c272c2cf8bf370ff9"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-8178467244852833766",
+        "outcome" : "c93110bef620b0fb3bed6a9cc70821da8dbed0d469feeb41b53354d2bcefdc02",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-5053191014914856086",
+        "outcome" : "e4966f7b8b92488acadba8d80f47bb526ee63335b6470130061d6a2f9a70b48e",
+        "localPayout" : 63281269
+      }, {
+        "preImage" : "3819476481835830143",
+        "outcome" : "6f6a367ecd79cfa82ec30266c302fd01056e903487090e5cf1f7809df649fa0d",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "e4966f7b8b92488acadba8d80f47bb526ee63335b6470130061d6a2f9a70b48e",
+      "oracleSignature" : "fc2a0b9d24c6f9fd72b1eca48079cbfb9b8323c62099906c272c2cf8bf370ff9e6324c5ba045d5c060022615b66d678d6d8188d5599f4b5e8c775e89375116ad"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914f6c44a44b0eb47b09af326f49ca6063596ec23eb8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "a7270886e4bdfc7d7a8565da8fa841f8e9208ae8060007c910c3de91ab3f877f", "fdd0b280be9e7d8cf6d0c0dce4a4ce1439ae12534806b717f2be722050e3afa5" ],
+        "redeemScript" : "002055e1619795081d9693a827acb4cfeeecbd430b80d9e408ee66d33c17f10cdc4b",
+        "scriptWitness" : "0147522102bc25e5bb463c1bdb8361fa24b4c767c3be929d54ba20ac23bb8d02fac11ea8bb2102a0e69c92c8dd44c713b0b38f3d4a8d915db5502aa2a97fb1b7e0e06bb081d64952ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qz9gf8rn4rf33cagcghzgpww27rrdugtlef2ddm",
+      "fundingPrivKey" : "3cca8d64b09ec0c9c71f671eea465b01dff50930efe721ebb1d08709ac670256",
+      "payoutAddress" : "bcrt1qqawyqxe4ea0yzwk2dvjjvrl7vwak3dygvr8pev"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020c55cbaad1714b598cf92f96c6f4f37453e46573522df48363c876f635ebb54dd00000000",
+        "idx" : 0,
+        "inputKeys" : [ "44677c73f0ac8646128c2289b3f073928740f0dee7fa9ec60fe3c68869bf94ff", "d66d6654067bf9937ce159a155eadfc77d23522fb270b449829530bd1072c66c" ],
+        "scriptWitness" : "01475221026be459d8ee09136b9f98c1e22a459902a03074c878be3b2b0d859c6f0f493cf3210224987b957ebf00ac49e2d44fa3ff11e718ec922db02d63dd9659022d58114ea052ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b42a54e008e15d4cbabb733c3098e039854d952800000000",
+        "idx" : 0,
+        "inputKeys" : [ "7f016bc0e1c10e3f05ff8eee345da075c47a1a146aee57ba2d5da2346b3c89f8" ],
+        "scriptWitness" : "020021031e0ff6c02e20cb121a959ba31509c9db46aff6a90fa38816c834a9fc57ba83c8",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qqhj09t6jgw835pjm8y6phjy94t084pc027xg72",
+      "fundingPrivKey" : "5d01a3a3ca05440ada9e1e93b1ee7ee7244210993d8391ec2a5d74b18cada4b1",
+      "payoutAddress" : "bcrt1qn0y8sz5k0t2y0wvd5dp4ysj7xysmy2dudww5zd"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000003f7f4f84437b21a2d592f947fa00071a7680784ef6b74db184ba592e0780ab9bd000000002322002055e1619795081d9693a827acb4cfeeecbd430b80d9e408ee66d33c17f10cdc4bffffffff499106ff7b917aa36d8e2674d09da6b6e7940bd4bff88dd583440349c24050dd0000000000ffffffffd812c525b253b0fde1ee0ecef043260a41c542f20ce8e67a780e01680baa18a70000000000ffffffff0352c5eb0b000000002200200e85df632fe8bf5b7df03ae0490dacc4f30a21fc10e3b85dad11fc72a102fe05a6dbf505000000001600141150938e751a631c751845c480b9caf0c6de217f069de1110000000016001405e4f2af52438f1a065b39341bc885aade7a870f00000000",
+    "cets" : [ "02000000000101506c2a4b5b5a175a5d1921eb457817ab9380a6c4c4a0fc7826b189fdcd4033ca0000000000feffffff0100c2eb0b000000001600149bc8780a967ad447b98da34352425e3121b229bc014752210352e15dc3c46b3070294a9e48cb277730ded7d956faa59a9650f2becc9851031f2103e8dc471e514db6b957529f7ee0e8d6fe4e536f7a691b8b87b3b77b37fd223a9152ae64000000", "02000000000101506c2a4b5b5a175a5d1921eb457817ab9380a6c4c4a0fc7826b189fdcd4033ca0000000000feffffff027598c50300000000160014075c401b35cf5e413aca6b25260ffe63bb68b4888b292608000000001600149bc8780a967ad447b98da34352425e3121b229bc014752210352e15dc3c46b3070294a9e48cb277730ded7d956faa59a9650f2becc9851031f2103e8dc471e514db6b957529f7ee0e8d6fe4e536f7a691b8b87b3b77b37fd223a9152ae64000000", "02000000000101506c2a4b5b5a175a5d1921eb457817ab9380a6c4c4a0fc7826b189fdcd4033ca0000000000feffffff0100c2eb0b00000000160014075c401b35cf5e413aca6b25260ffe63bb68b488014752210352e15dc3c46b3070294a9e48cb277730ded7d956faa59a9650f2becc9851031f2103e8dc471e514db6b957529f7ee0e8d6fe4e536f7a691b8b87b3b77b37fd223a9152ae64000000" ],
+    "refundTx" : "02000000000101506c2a4b5b5a175a5d1921eb457817ab9380a6c4c4a0fc7826b189fdcd4033ca0000000000feffffff0200e1f50500000000160014075c401b35cf5e413aca6b25260ffe63bb68b48800e1f505000000001600149bc8780a967ad447b98da34352425e3121b229bc014752210352e15dc3c46b3070294a9e48cb277730ded7d956faa59a9650f2becc9851031f2103e8dc471e514db6b957529f7ee0e8d6fe4e536f7a691b8b87b3b77b37fd223a9152aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "6e8568a8231899aae960f0013ef37b65006a1cba7e876d039e50b4d19ba11107",
+        "nonce" : "3d63c54994eeb66162cab3f58644ce227f247a37e227158dec2cfd7562f5d50e"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-6873713138300158220",
+        "outcome" : "cb3b56273eb740ad4927de70ed1d0498d8df14628f39abe87abb7ec683441b8c",
+        "localPayout" : 108825558
+      }, {
+        "preImage" : "-4354377474623678594",
+        "outcome" : "6ddac22b4e0297455dc428f62b44ab1449023c94dcaac70e13318f7fcf19e853",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-7202377403661074921",
+        "outcome" : "9d35d74016441d725d3eb2f395bd70dec04605cb96a1bf37ce654828427232ba",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "6ddac22b4e0297455dc428f62b44ab1449023c94dcaac70e13318f7fcf19e853",
+      "oracleSignature" : "3d63c54994eeb66162cab3f58644ce227f247a37e227158dec2cfd7562f5d50ebc2e1ea152e471ad5a8f5d4b0d7c675e7f8fdf28771f7477066b32277e7b3e76"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600142bd9797d024643a3e65493b9d1577c4607bc1ee100000000",
+        "idx" : 0,
+        "inputKeys" : [ "92d07f40860c1fd55d36153e00e5e32e1814ae0f520560a422cafbefda9daa0b" ],
+        "scriptWitness" : "020021030b8d959acdcddba7dc93415d1d8f487118a18808ee329b9ab34f3090f9dff9d2",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q97784kc0cqnf5llyaham84qt42d85nsm3kad2k",
+      "fundingPrivKey" : "eb9071ea092d5229f783fc3753c62ec041755a26b6b0a74a239ccb39dd906764",
+      "payoutAddress" : "bcrt1qqp4akrlu5yfgrmph55sfxhxuuwnxhykwjnl7he"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020874016cb493de6bb37143b69d1e07bf3861b0b949b5de883484e7b81eb1bc5c500000000",
+        "idx" : 0,
+        "inputKeys" : [ "15e9a6acbfcfa206fec4d2b342f391976b53d5bd95a178a3c50a04c519f82a37", "f4ca1f803ea49de3a58d7f5daffc2ba7d3aa35e8d0bc147b7c7239e6c19df8f0" ],
+        "scriptWitness" : "01475221029f66cfa2af5d4a06104d9f43ab6081e720faefe3b354c48561a936e011d26fd42103baec773746bf1163e436ada69f8dde05184f6086472e5324152847e2e911a23752ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91473e7ef849361f64052b6d574c317fe07163c6f9b8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "75ca04c922b5018f0846ade3a359cdaec70cce89b871c4a2cb096f4d5ec73471", "472894fd3459f3553a52fc999c72729976727cb329bcea23ad8faf2d85c48fb2" ],
+        "redeemScript" : "002090f6058d638ab74117e6d70953aebe9e8943c5381364b24f4c73af7cc6ad7647",
+        "scriptWitness" : "01475221028db7fa29c44215d40ae0ce4e65941015ecbdc46a23113742c0f6306ec37352722103fa093059d5a677cade147b71d60b46907eed301be306576527a5a9f9e29de25852ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914396edfbca959942fd02c701562f982fea07d1f418700000000",
+        "idx" : 0,
+        "inputKeys" : [ "a4bd77fdbf4fcf088c9b13b34ef7da8a3151e0ad2724e0b2dbdf87befc473e12", "a13fcca60fba89d1e41b997d1358dbafb726db90f11cf0d0a82c41e767ab82d4" ],
+        "redeemScript" : "0020a028198c78a0b9a9dc34580111a2dff7a2676da08dd5e1049226a001fcb1224f",
+        "scriptWitness" : "014752210349d76dac60f7d3b191b63580d77a05c365293351c6d0e498e301912ef6717d8b210214a793d702aadeb4a980ecf10c9dbdd44c8dbb13596d64e9a247641eb7d1840052ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q38rkgj6t23mn5tc66dhjv9udcrzk9a45ptdx0j",
+      "fundingPrivKey" : "3830da98d64e4d417a7c6935d5b8e7efa97302cc0b79130f3f62beac91d22dd8",
+      "payoutAddress" : "bcrt1q2t830ldmha62nwymcpm588m3yvcqfkxlhe8ek7"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000004f4f7f2fd275d8f69e394e9dbf94dd7c7e71dea86bb706752cf2f5c7476281b7e0000000000ffffffffea8fac2de537912f3f34867d8d80edc3351255af540d4265eddfeb8e7aee8bf00000000000ffffffffa6101dddf58afbec300d8506f8f1ee4fef516dfbcc97dea181719d8c3759c3d1000000002322002090f6058d638ab74117e6d70953aebe9e8943c5381364b24f4c73af7cc6ad7647ffffffff21286c302d52d20c2b5afa57c5844ce2497412a22e7adc24edf978574d1f774b0000000023220020a028198c78a0b9a9dc34580111a2dff7a2676da08dd5e1049226a001fcb1224fffffffff0352c5eb0b00000000220020df7d18ef3ff021bbe73a77ccf6a9079511afc48df784dd5d57ac2310b53ebb51e1dcf505000000001600142fbc7adb0fc0269a7fe4edfbb3d40baa9a7a4e1b3c5bcd1d0000000016001489c7644b4b54773a2f1ad36f26178dc0c562f6b400000000",
+    "cets" : [ "02000000000101c0af82b203a152aaa2f27f5fa1c5e32804ac3b38d40826ec53a10ca7bfe2a2520000000000feffffff02d68b7c0600000000160014006bdb0ffca11281ec37a520935cdce3a66b92ce2a366f050000000016001452cf17fdbbbf74a9b89bc077439f71233004d8df01475221028916e232718b585c21def39859cfc104c41f190ef519249da798c8db05bf93b42102fd73617b42f444c86613328702e91868039b2be156db4bff8c134e89f26eda2752ae64000000", "02000000000101c0af82b203a152aaa2f27f5fa1c5e32804ac3b38d40826ec53a10ca7bfe2a2520000000000feffffff0100c2eb0b00000000160014006bdb0ffca11281ec37a520935cdce3a66b92ce01475221028916e232718b585c21def39859cfc104c41f190ef519249da798c8db05bf93b42102fd73617b42f444c86613328702e91868039b2be156db4bff8c134e89f26eda2752ae64000000", "02000000000101c0af82b203a152aaa2f27f5fa1c5e32804ac3b38d40826ec53a10ca7bfe2a2520000000000feffffff0100c2eb0b0000000016001452cf17fdbbbf74a9b89bc077439f71233004d8df01475221028916e232718b585c21def39859cfc104c41f190ef519249da798c8db05bf93b42102fd73617b42f444c86613328702e91868039b2be156db4bff8c134e89f26eda2752ae64000000" ],
+    "refundTx" : "02000000000101c0af82b203a152aaa2f27f5fa1c5e32804ac3b38d40826ec53a10ca7bfe2a2520000000000feffffff0200e1f50500000000160014006bdb0ffca11281ec37a520935cdce3a66b92ce00e1f5050000000016001452cf17fdbbbf74a9b89bc077439f71233004d8df01475221028916e232718b585c21def39859cfc104c41f190ef519249da798c8db05bf93b42102fd73617b42f444c86613328702e91868039b2be156db4bff8c134e89f26eda2752aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "7269c3b9ddfef5d107183e5f89125af233fe3660e8d6b30c78389c53e9b6bc08",
+        "nonce" : "123489ea5a833821399ed57dd21a2f7114ff3e2249cc8965ae90622e475bd7ae"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-8982444808279970336",
+        "outcome" : "b4688ead29e47e6afc60b7f9c605ccaa2d3ae0a098983f2603f33399e0f2857c",
+        "localPayout" : 148258919
+      }, {
+        "preImage" : "-879491289648572849",
+        "outcome" : "dff8046ed12fc03283fa0f216dd1a4755bee7e5de8c5ed68a367ba13bd2c3664",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-1319665636595198880",
+        "outcome" : "916d3b50afd4539ff76e738c574a636b45574f11eafebb31b271357fe8e17311",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "dff8046ed12fc03283fa0f216dd1a4755bee7e5de8c5ed68a367ba13bd2c3664",
+      "oracleSignature" : "123489ea5a833821399ed57dd21a2f7114ff3e2249cc8965ae90622e475bd7ae66a4f9dc2910b9cf3cfac0a178a3fa132435d5c2b711ddabbd81b57bbbf14b90"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014f12e4beb653eeb5f931d24359c16f8ce1e2f908e00000000",
+        "idx" : 0,
+        "inputKeys" : [ "1bdf4aa022a3550f68e0268d91dd9f35fa31a6eb0e7a8a8d3b60f90e1dbaea47" ],
+        "scriptWitness" : "02002103cafcb5a7b2c3103994c02f1c896d6b952f7bce6025a4c66b8e8b4ec24aaf974b",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qrp7m2jja4sfc40438hr4lq07uvgm5q3wq4gv7h",
+      "fundingPrivKey" : "ff6c7f99855366afed18fa1a528acd76c952b6be8c1ab69bb1ce1e426f8d1a3a",
+      "payoutAddress" : "bcrt1qwrxal9003mqwmh6yt408nsqwrknunp86e0qg90"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9140970a118f71d96645b5d6d0b8bd657eca55936d48700000000",
+        "idx" : 0,
+        "inputKeys" : [ "4955ffe3056d53228d177c6bad1659817ff17991f095abb0a12aae14ef849aae", "65140092f44dc6c3feb1e7efd8f65e79b12cc86dbf1ee373dd06d9e54807f412" ],
+        "redeemScript" : "0020b5c5fa9c23c0fb056bf7c782d0a861c1ae9cb57a48d332cfd31572144f00221c",
+        "scriptWitness" : "0147522102765b10b59e0c9d0123317f779c01d31c6d1b57925505e5fdd410b1eccf8383c521033aaf66e36f89b57c73b63bfcaa42df922904acdac488cf24ffe4a4754296196752ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014cea6bafc962610df8534380b88fad55a4104312300000000",
+        "idx" : 0,
+        "inputKeys" : [ "0542e50b53060b8c921a027e359d588c52bacad881be33e34d3d7b36de50dbc8" ],
+        "scriptWitness" : "020021030b44ba5b6f5156183f77e3b83cc5b4d34016a751084abe97ade86aa17d8073ad",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020f25a20c1607c7370712b27c9353eb283ee975e2438b90346df623b44df2f1b0200000000",
+        "idx" : 0,
+        "inputKeys" : [ "2e794a3133640b888a412777d045e2f2e39f14840736b24e209f2cc3ae74dab2", "37013b55d092b206b870f1c351e5ed8289fc2147c33544e540d8bc77c53706cf" ],
+        "scriptWitness" : "0147522103bf63d422c5ad7d5ec15fb2c8cf2fb98d3a74b17d9e34b82bdbf8281dd1bebae021034214f782770aa1b001c3f5d8cdbc4d83c8817a05fe246e06267ce4b2f4dd3fe752ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001441ef9367e957e6930bf8f3b262794192b086b41b00000000",
+        "idx" : 0,
+        "inputKeys" : [ "9914cc074fc9688f2dccc2810ca41329208f2a31d66326373d03b166282bbe1a" ],
+        "scriptWitness" : "02002102b409ad2d9b164c292816a5acb153591e8ce5ffa54d94d2a3f3e93d33a98dc7ef",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91407808b181e2f9861dd7bd17be1e768c82011bf118700000000",
+        "idx" : 0,
+        "inputKeys" : [ "6739b2523cc2ac348928be48c3d9fc8ede91fee92393bbf191109527fd59ebb0", "cc26d342606a59cebefcf0e0838ab9f34e1de4a036e8bf8b19b0a20168e54c81" ],
+        "redeemScript" : "0020b35667bb96f5450e936a5e90e35e7fc4f000370c191f87f5e687b56a2d1be90f",
+        "scriptWitness" : "0147522103caab0d8609254b09c0ee2a5a7bb150952ce87f168b1f17931e08da38f0127e582102e0a3ff9b2e56a1f96e0d29a767f8c69c8a7af5dfd0336e6f8ae21f5db727769952ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600144c1069770c5cb6552df67d90c8fbb5aa827520e300000000",
+        "idx" : 0,
+        "inputKeys" : [ "6a6186a98bffdc3716c509e61bebaaa5d2edaa1ff02c0c5b32e34c7da9e7f3e9" ],
+        "scriptWitness" : "020021027133811687fa1d2de795a5dfaf56607a91c72461e815fd8c51b091a0591ded82",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914251de479809f3c579721236c22cfd569c497b4e28700000000",
+        "idx" : 0,
+        "inputKeys" : [ "8b0064308af624f149d74f188d881354af7d1dc4e277cbdabb6af7e2d7302c56", "f427b9258445de433467e87eab01423361f346e10a236a866ed5fb26c95bf0db" ],
+        "redeemScript" : "0020e910320cda42447721ed4cc087180e6ee803d724a2b0c148cab0380c2588411e",
+        "scriptWitness" : "01475221029409f63554955fb09c052a9d48866853ea44fe7f6d60cbe88fed9af4c22648a52102501ff43e6555e35b6173c779baed8ed21f598f92438fa74e7776adee53d93c8352ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014d4ec70efccd9f0147da3889489bca72f052709d900000000",
+        "idx" : 0,
+        "inputKeys" : [ "a8e9a05e886e2538c878f80d49cefc8d8812e5d8cbee6ac235484d7e0bb44a00" ],
+        "scriptWitness" : "02002103566a65b0f1aa7189f80a2bbd394e592bb140c5eacced5ffdcd98a88517aa20dd",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qk5svnddqzkzaxpm3ldrqtr7hy7fexsza5tff42",
+      "fundingPrivKey" : "a1de0682206ea5a7bd0982278190b0c93712b2aa0384e63c33503f73d745e896",
+      "payoutAddress" : "bcrt1q42atxeuauxrvprt3jp770zpmacv3jgm9d76yef"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000009be5b019dc943e311cf3f316f036f7e9d689ee3af9c1b1e7cad8bbef267a74bd10000000000ffffffff5bc1320c3fa944d61738c847738d9aab375e921c3a8ab14732312852836520390000000023220020b5c5fa9c23c0fb056bf7c782d0a861c1ae9cb57a48d332cfd31572144f00221cfffffffffd991a2b4a999de20fa3e09125d57943ec3550167365baa1b6d2b6886f7db1980000000000ffffffffa921157c8a79a82c1b182824b4d7afd88d0c571a1f926ecb273f725e8e1aeab90000000000ffffffff22f9b89b337a7201d02be3b5f8584b7cf263ea0e5b5824d68b7e3c2d4b08d62c0000000000ffffffff295d46a0567b6319cc1b630fc712d933db6cd0ff6aa39740895733a119d61f640000000023220020b35667bb96f5450e936a5e90e35e7fc4f000370c191f87f5e687b56a2d1be90fffffffff66025e81ee3b85c80e5f75fe2a2ac79f5b999677825986277631353052690e570000000000ffffffffff715105d4aeb1a460b3719ca134246661b1bc36046bcf08c5a445f6d8ab6aaa0000000023220020e910320cda42447721ed4cc087180e6ee803d724a2b0c148cab0380c2588411effffffff1657c07b97f92c5bb39e1fd731f8db696777a68c6c16d64620723522304b30380000000000ffffffff0352c5eb0b00000000220020fb4ec6fb37ef277f4b53bbcd73f82774cb2e5c4f97a95557076b4ce5a06cf666e1dcf50500000000160014187db54a5dac138abeb13dc75f81fee311ba022e671d685900000000160014b520c9b5a01585d30771fb46058fd7279393405d00000000",
+    "cets" : [ "02000000000101a71400cfad5e15d77497185fbf33c068931bee24111a463628467f1ade0877680000000000feffffff026740d6080000000016001470cddf95ef8ec0eddf445d5e79c00e1da7c984fa9981150300000000160014aabab3679de186c08d71907de7883bee191923650147522102a73e777cff05b4a43d3fbdf36a8c3be508c2a0b133d0ef2d91f42ae5265327c12103e2d2d296db3bf5e15352c4a1ecc7c8505c6a52d974eae558c6b428baf174bfc652ae64000000", "02000000000101a71400cfad5e15d77497185fbf33c068931bee24111a463628467f1ade0877680000000000feffffff0100c2eb0b0000000016001470cddf95ef8ec0eddf445d5e79c00e1da7c984fa0147522102a73e777cff05b4a43d3fbdf36a8c3be508c2a0b133d0ef2d91f42ae5265327c12103e2d2d296db3bf5e15352c4a1ecc7c8505c6a52d974eae558c6b428baf174bfc652ae64000000", "02000000000101a71400cfad5e15d77497185fbf33c068931bee24111a463628467f1ade0877680000000000feffffff0100c2eb0b00000000160014aabab3679de186c08d71907de7883bee191923650147522102a73e777cff05b4a43d3fbdf36a8c3be508c2a0b133d0ef2d91f42ae5265327c12103e2d2d296db3bf5e15352c4a1ecc7c8505c6a52d974eae558c6b428baf174bfc652ae64000000" ],
+    "refundTx" : "02000000000101a71400cfad5e15d77497185fbf33c068931bee24111a463628467f1ade0877680000000000feffffff0200e1f5050000000016001470cddf95ef8ec0eddf445d5e79c00e1da7c984fa00e1f50500000000160014aabab3679de186c08d71907de7883bee191923650147522102a73e777cff05b4a43d3fbdf36a8c3be508c2a0b133d0ef2d91f42ae5265327c12103e2d2d296db3bf5e15352c4a1ecc7c8505c6a52d974eae558c6b428baf174bfc652aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "44c309f9f31510244c0652783329cece975ed988edd694bb100ecc0155795d7f",
+        "nonce" : "b4f4fb6f1929d26e2b70de3a02fc505933aa826ed3208ab6aec23eb84c24e040"
+      },
+      "contractInfo" : [ {
+        "preImage" : "1999090168215671133",
+        "outcome" : "ac730230a534b75074eafb5bebb352132dc0c8c822a1d118312f9073391fcd32",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-5219030132316997323",
+        "outcome" : "9abe565185d012c60533fbfc39f95e39b4f42918b3238790b2982858035ae57a",
+        "localPayout" : 0
+      }, {
+        "preImage" : "5540975711006882993",
+        "outcome" : "8fc30f034e6aaff8120d012d787591485db2e715f56ac27003ecd7266648daa5",
+        "localPayout" : 50275717
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "9abe565185d012c60533fbfc39f95e39b4f42918b3238790b2982858035ae57a",
+      "oracleSignature" : "b4f4fb6f1929d26e2b70de3a02fc505933aa826ed3208ab6aec23eb84c24e040049d5c2ac62132697c7bd66ef25698c330915c0d7a330885608ebb8192fb751c"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9140442fe42c836d47aef5f93248fbeda74215235f88700000000",
+        "idx" : 0,
+        "inputKeys" : [ "49ff2ada9f3f72217b585c9d2fef4eea9094a09621021505ed4c8ff1a8dafcd4", "91b6eb77863242d02e975f372e73822136a4c5f27677f7b529d3b0b5387220f2" ],
+        "redeemScript" : "0020ab5a2ecccdbb767a90c1be2ad63089a334d1cf96b634417b22fc830faad13fc8",
+        "scriptWitness" : "0147522102a6606dd5c5fd245ce0171195c78b45fd52a3dd009e928460bf287d713315b8f1210214da31d4b102a455df171a8610f9f33dee26fae7183051e5c4f7fba71baad3f152ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020407d490e11ad82e7be926f42f6aab0f9e8b6881a2b0ad9bd3da533663dbc6ce900000000",
+        "idx" : 0,
+        "inputKeys" : [ "cfa6f0f232697e2090dde377bb996f5119a9abaaae63902c012b4b2a35885225", "54ccd694e37db3adcea1692c3f0dc880b48d208afe3d1223ef1be51d732205b1" ],
+        "scriptWitness" : "01475221039972a5d6fbe59a489647e0efbeef236d5a5898e6f16b3bb79f19dee15b94535121029fbb035c238add2dff0a2733875bb73fb8e8f9b9600c359a203f1e7cecf87c9152ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qhlaunqc9t6p5hkscmyy58us5skfhe0t2c9m3h9",
+      "fundingPrivKey" : "e55a91710476ed21ebde8ca3c5faf9d339a339a7dcd6fa4a43e4e55fd687e093",
+      "payoutAddress" : "bcrt1qdsxkkuz0dq367mf2sqg2570c04ytu8n82lpa4p"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001495ac4a2d46c1a8d720db3853c665800b4043972e00000000",
+        "idx" : 0,
+        "inputKeys" : [ "f11e42dfd7592b4e9a07136bd171cdaff4e7a089d60220a752641269eae3955a" ],
+        "scriptWitness" : "0200210312d29b5fed9312dd0ab50fc49a6e881895bf10592efc69510a2eb7a77771523c",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qja5e4g2yzkrsay3mcczfmh6fmud2wmfy9kl80e",
+      "fundingPrivKey" : "198cca3e18887377b66435a6d978cc2548f880e6578150a349c24f4705a1bdfb",
+      "payoutAddress" : "bcrt1qqs5zu4z8ujeew65pcgzxpt7n80gpld5x3tpq9c"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "020000000366b3e09c0c361bc3f6273b0028279c882d5ff3c39bedbe6e360b54b3e616552b0000000023220020ab5a2ecccdbb767a90c1be2ad63089a334d1cf96b634417b22fc830faad13fc8ffffffffe337e36105c2f3164c6b03f9d850d5e61244ab6f9c4a0c1a723521b069c15e610000000000ffffffffa57bf9ce5c384c0bf5724cb19f2219c5b8f47295d8e0c946da3a5e3acce7282f0000000000ffffffff0352c5eb0b00000000220020b3d351cb4a01fab71ca8816f89b329b4adc638a4fcf6ab6ff1c5c2c844a92ccdcb9be11100000000160014bffbc983055e834bda18d90943f21485937cbd6ae1dcf5050000000016001497699aa14415870e923bc6049ddf49df1aa76d2400000000",
+    "cets" : [ "02000000000101dc1a23d3e3f2b9869f32d1a760a7052bc1276f65837aa6268ef661b2d8af82640000000000feffffff0100c2eb0b000000001600146c0d6b704f6823af6d2a8010aa79f87d48be1e670147522102bbd22b9a5c31239975d6b0204d6bb1867782d08817ed133eb9133efdb924489c210360ab0f90b94abec2264cbfb7caedcf8b4e23e452cfe1e367159137ecd5c6a18e52ae64000000", "02000000000101dc1a23d3e3f2b9869f32d1a760a7052bc1276f65837aa6268ef661b2d8af82640000000000feffffff0100c2eb0b0000000016001404282e5447e4b3976a81c20460afd33bd01fb6860147522102bbd22b9a5c31239975d6b0204d6bb1867782d08817ed133eb9133efdb924489c210360ab0f90b94abec2264cbfb7caedcf8b4e23e452cfe1e367159137ecd5c6a18e52ae64000000", "02000000000101dc1a23d3e3f2b9869f32d1a760a7052bc1276f65837aa6268ef661b2d8af82640000000000feffffff028525ff02000000001600146c0d6b704f6823af6d2a8010aa79f87d48be1e677b9cec080000000016001404282e5447e4b3976a81c20460afd33bd01fb6860147522102bbd22b9a5c31239975d6b0204d6bb1867782d08817ed133eb9133efdb924489c210360ab0f90b94abec2264cbfb7caedcf8b4e23e452cfe1e367159137ecd5c6a18e52ae64000000" ],
+    "refundTx" : "02000000000101dc1a23d3e3f2b9869f32d1a760a7052bc1276f65837aa6268ef661b2d8af82640000000000feffffff0200e1f505000000001600146c0d6b704f6823af6d2a8010aa79f87d48be1e6700e1f5050000000016001404282e5447e4b3976a81c20460afd33bd01fb6860147522102bbd22b9a5c31239975d6b0204d6bb1867782d08817ed133eb9133efdb924489c210360ab0f90b94abec2264cbfb7caedcf8b4e23e452cfe1e367159137ecd5c6a18e52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "574bf27ca10ef24521f186dfa7a9f21a44b62e89e0eeb5d0d9a9060e7cf47e9d",
+        "nonce" : "9c56f5d7ca56461e2e24cf6b2888358cb1a42f20f8759f6248e3e2d0a188bd17"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-2148823220573528725",
+        "outcome" : "e15a9ca766f53fb3f073a8e62a87ebb0dd1b33ce26da3271afbe979249d298bd",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-5375060586493177617",
+        "outcome" : "d5fc21b26d695b8072f86593f25d09bd623c99c6a023c97916a1f5a6bdd4a365",
+        "localPayout" : 95763100
+      }, {
+        "preImage" : "7677473478775863100",
+        "outcome" : "c68e1cf50ea454538895bbeb38cc13aa43d39d90922c6433634b5c4cb0923f01",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "d5fc21b26d695b8072f86593f25d09bd623c99c6a023c97916a1f5a6bdd4a365",
+      "oracleSignature" : "9c56f5d7ca56461e2e24cf6b2888358cb1a42f20f8759f6248e3e2d0a188bd17eff0b47596232bd316480211ce394e4ce5ae8d9ff9fd7a4af3e5823029662b6b"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914e17945adfd9117c164469021cf389d0b5b81a4248700000000",
+        "idx" : 0,
+        "inputKeys" : [ "e7e217af50bd0f52247ce22fb706edaed7baed77aa003905f000c4f1eedfad93", "b0ab814f00321280dbf2490020f3d55d673548a48303a829dbdded3151c5b082" ],
+        "redeemScript" : "0020e804d5d69f2c2d6513041127734940ebf10005895d0d3700d0813e6edc491be8",
+        "scriptWitness" : "014752210244f8aa155ed8bbf2c29778879e78fbe1f9d8e00cd23d21a91810dd52c6efd0a72102e51037140a94d6e8f745697cb6230dbbfcb215622d308339258766f9770115c752ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200207ce92b489aed8ee5c620279d46459b56e5e94dc2c2a7acc0ec7b8393922921e200000000",
+        "idx" : 0,
+        "inputKeys" : [ "16c92d375f6826973295a9526772657d1a84e0e6fff0cc32610fe7da827f1ede", "e2dbe87c4c4c08457fc3496e13c4a32528ee0950da42facff848ae13a33677ce" ],
+        "scriptWitness" : "01475221025d02a383157336450331fccc09250e9d274f5cb35d3b40a3ceaa4e31cc73e8162102635b7f6c098c584ffb7c7621a2a85e278978a08354c5381d7c29a570d70bfe4152ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qurfe9emaye2msqxgcqnv70gehe00n6hwpkrucy",
+      "fundingPrivKey" : "1a6f9bbd48f9d89d612c61c494aaee985446cd77f5f97199b171751d1e645768",
+      "payoutAddress" : "bcrt1q62tc76w3yqpfewytt9z4ewf6spel04ztgnkfzn"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600147d110e28e7de2d8eddc54af068018e321789755600000000",
+        "idx" : 0,
+        "inputKeys" : [ "a9db89258553344bdfd2403e003f9fb179221e279d73ea4cf4a2018286b14f56" ],
+        "scriptWitness" : "020021020bfac8c76076020d82587d2c7e7ce0f12329655479ce1be64312937131376e79",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914fe5a6510e4f1952b636a356282876fa900730bc78700000000",
+        "idx" : 0,
+        "inputKeys" : [ "d909d3a38af703826dfc254c078eb34abe3309bf1476738dcbaa6cff78c84b3e", "7b854a326cf6b978996cb8494a3e2b608aebc190db76e263f7c031a27d14e5bc" ],
+        "redeemScript" : "0020bfddbf231eef804e03794b3769cdc74bb7308904a588ff5c2343cf935d67da7e",
+        "scriptWitness" : "0147522102ef6bff0899749c7caeccb06bb8f77d016f7091735efbdba0c5503f8a6571f3a02103d70a7c81d5c0ad29c49d8c21dcd6049f779649752e2c6038c86b5c0a5aaa491a52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qt98wlw833np0x6wg9e8su9wh8e2463zlhjtqj3",
+      "fundingPrivKey" : "bb5b56ba546a6f9b5f0ce24762c08f1e1fe98f35382e3ab1edafd7f6577254d4",
+      "payoutAddress" : "bcrt1q832n4hcr6yhngjskd03g8hmc48ala979klj7vx"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000004ba1ad4608d545d875acec45cf4d35bf76acecee87810d655d749f8116bd20c760000000023220020e804d5d69f2c2d6513041127734940ebf10005895d0d3700d0813e6edc491be8ffffffff4461694f9ac1c1511d5aed311ef3e11cc81593b49f66a25007d8b23ca6901f960000000000ffffffff7e8db729d229b5fd66384ad1a5568b1dda26b8f198d106c331b03eacf409454f0000000000ffffffffa77487d8af8e9e21ce1187d763dacd0dc90d58bbbfb648461487b6d80b75f3760000000023220020bfddbf231eef804e03794b3769cdc74bb7308904a588ff5c2343cf935d67da7effffffff0352c5eb0b000000002200200c2ab98ae91e7c75a977047b35841dc19b6863c2cc0136766d1e90636b55ff9acb9be11100000000160014e0d392e77d2655b800c8c026cf3d19be5ef9eaee579ce11100000000160014594eefb8f18cc2f369c82e4f0e15d73e555d445f00000000",
+    "cets" : [ "0200000000010183aeaf678aadff5ea3c361e4543b277a9c825797e40ca55f425e2fc18df91a860000000000feffffff0100c2eb0b00000000160014d2978f69d120029cb88b59455cb93a8073f7d44b014752210287a75bb2464df8806486a1640fba34b21384bc3bafa9971e0b77c2868c70731e21036bb9bcda9b9a46daad6b1394e5baf61a50cce7d9393f9fecde7f2b78f9c1795e52ae64000000", "0200000000010183aeaf678aadff5ea3c361e4543b277a9c825797e40ca55f425e2fc18df91a860000000000feffffff029c3ab50500000000160014d2978f69d120029cb88b59455cb93a8073f7d44b64873606000000001600143c553adf03d12f344a166be283df78a9fbfe97c5014752210287a75bb2464df8806486a1640fba34b21384bc3bafa9971e0b77c2868c70731e21036bb9bcda9b9a46daad6b1394e5baf61a50cce7d9393f9fecde7f2b78f9c1795e52ae64000000", "0200000000010183aeaf678aadff5ea3c361e4543b277a9c825797e40ca55f425e2fc18df91a860000000000feffffff0100c2eb0b000000001600143c553adf03d12f344a166be283df78a9fbfe97c5014752210287a75bb2464df8806486a1640fba34b21384bc3bafa9971e0b77c2868c70731e21036bb9bcda9b9a46daad6b1394e5baf61a50cce7d9393f9fecde7f2b78f9c1795e52ae64000000" ],
+    "refundTx" : "0200000000010183aeaf678aadff5ea3c361e4543b277a9c825797e40ca55f425e2fc18df91a860000000000feffffff0200e1f50500000000160014d2978f69d120029cb88b59455cb93a8073f7d44b00e1f505000000001600143c553adf03d12f344a166be283df78a9fbfe97c5014752210287a75bb2464df8806486a1640fba34b21384bc3bafa9971e0b77c2868c70731e21036bb9bcda9b9a46daad6b1394e5baf61a50cce7d9393f9fecde7f2b78f9c1795e52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "860ebce7a0f2fb2c80c33aaefcfd4a2336f6c009e236b27e1f65b68252a8b797",
+        "nonce" : "600c59b0fc0acda3a3cb5fe357b02798f87d8ef8015f5dde80d1ac04b1c7d2ae"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-1036259599405533416",
+        "outcome" : "bf26b78f5e8a75ce4ef23817e1a75168dbc1fc42ed3ca5368bce74e9c9c26ec7",
+        "localPayout" : 141955175
+      }, {
+        "preImage" : "639670333397925842",
+        "outcome" : "1ab484c192825cad5644cefeb54508d91b8d243d55400ee8d90fc5062f666895",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-1095642857779625431",
+        "outcome" : "46abe95c373e914d0bd26b91499d7eb974ae6f72ab35bb4b964e014f9d4a8d92",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "1ab484c192825cad5644cefeb54508d91b8d243d55400ee8d90fc5062f666895",
+      "oracleSignature" : "600c59b0fc0acda3a3cb5fe357b02798f87d8ef8015f5dde80d1ac04b1c7d2ae6be91695342af48f5c11ecc4550f4004f224fe78296a9942553a18a16e8667a6"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9149094c44c321c988d118a3051e59da1e6ff4711d38700000000",
+        "idx" : 0,
+        "inputKeys" : [ "0368214eb033efca772387acfd78cc02a439c8aa43e08ec53eb300d19644aa8d", "3302929f01dc5537e0787578616b86a3dcad045977b9344c7ae3f1766e0e2e36" ],
+        "redeemScript" : "0020e68bc54e2964824724316ee7aa6b8e33c7af0a640ab724a87968259015a439b6",
+        "scriptWitness" : "01475221024cfa41eef1c8bcf7b8de01cde7cf88afe1458812854707e08e39892efc8b6257210290ab55ed2f95404a4554648ff43490e0d0c34de4640adee11d4819ede958462852ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91472881576b111ed98cf0803eda2670202586d39918700000000",
+        "idx" : 0,
+        "inputKeys" : [ "cbc43cd3b16d09f8ce9a89d142fcc55d389a73f1efe5afb2926270aee6913826", "f00ed3e405a1493bb385d887a561e2636336ea7c99c9462e1d324b601cccf731" ],
+        "redeemScript" : "00201a9a23c8b03604f7d25de65815122c7a6b509d57c73883a52daea388627e5c1d",
+        "scriptWitness" : "01475221036e486d6826fa4d5c69a47f470eeca4b92bc180c450fc8a6bea72f5e46a751ece2103af5386d719c9fc5f7d932aac6d0a972f8a8cc40d8fa2bdb8402301a947ab34e052ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q5ryf2x2n4xn86v22phaes2q8rkknnkkwxsmcz4",
+      "fundingPrivKey" : "17c7c4f121d2efadd6ddc66cb789da8c187e63a3989ee8658141f91bf9ac87d7",
+      "payoutAddress" : "bcrt1qy38ny4a39qsuf5dd8rxs5yzj76wptym50e7qnd"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001478b73ea6df73a244fc94ace01347a6e3239986de00000000",
+        "idx" : 0,
+        "inputKeys" : [ "034329da675633dfb1118ffaf5e07ddca147f57b97f51374d3b6164885bec2cd" ],
+        "scriptWitness" : "02002103014c9a43b66d1101f84fb37d567671edd355e46ee01aeb0878b43ac2521d39be",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020a2b0af90babddb1ad16fc33ba9c59715116cf58f1c2577b1298a969dc5cb7a8d00000000",
+        "idx" : 0,
+        "inputKeys" : [ "b95995c647df656b6af469b785d8c75a592388a1d647e00a506322bfe113b525", "79c7a0e31fa2392ddf3b4a8113fdbf3e65f89d6de3f595cf038ad0aca60a897f" ],
+        "scriptWitness" : "01475221021b717fe1d08a67dea55e81a9a4c71351802211ce3ffe84c823dc1c309aeefde721034a2fb5c73611337d6cdb5bc796ae6a73f5094802786e45ffb6dfd91bbbf2566b52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fff53e72a97ee584278c00b2e56519959499c50700000000",
+        "idx" : 0,
+        "inputKeys" : [ "7fa756e4c86db6d62da97a92cf9977840e391e3c3ded77fae08c6d07f7b6293a" ],
+        "scriptWitness" : "02002103637778a81baa44b1a33cbf239186b76f61aa3e19e14ca702b2fd17f0dbf03ced",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qn767r0dgugv7577ylw8v69a4y36nspx74ny0j0",
+      "fundingPrivKey" : "64a16e85ed1fa1c73c8e38d748ecf242e3285e5705fbba7e619f3579a8df2a03",
+      "payoutAddress" : "bcrt1q6mecxlymvzedn694rm6fxkqq4pv0tgstunknat"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "020000000569d2329af58d249e20ab112f439e12b1a58fc4e7b0f97cf691d96a78e82a0cf50000000023220020e68bc54e2964824724316ee7aa6b8e33c7af0a640ab724a87968259015a439b6ffffffff923808ae5d074f12bb6d5f71485868bf4e3b48a129945e82a7c0d9c806d3085e00000000232200201a9a23c8b03604f7d25de65815122c7a6b509d57c73883a52daea388627e5c1dffffffff3b23d6ba50d93c4e6d5d2de8abaa58a691bd95512f1ef9e80e3e8d6ce77a05130000000000ffffffff95dc6233c3775107f9c4c0cd5ec5ed40851900dddc63f09be495e278320429bd0000000000ffffffff1de565098793510f126945b8f0b9fa12abc0bd87b26b3bfb5c0fb50363a6f4190000000000ffffffff0352c5eb0b000000002200203c364804b437fddae6a1455ba18e52ac81760cff47ed24a33c7725f0524f6cb61c9be11100000000160014a0c8951953a9a67d314a0dfb9828071dad39daceb25dcd1d000000001600149fb5e1bda8e219ea7bc4fb8ecd17b524753804de00000000",
+    "cets" : [ "020000000001019e80a1b7d28d2aeeb410624efeb4626751910ccc20f1dd4dcdd401db4191f2260000000000feffffff026710760800000000160014244f3257b12821c4d1ad38cd0a1052f69c15937499b1750300000000160014d6f3837c9b60b2d9e8b51ef4935800a858f5a20b0147522102b700c1c65fe4ff62a06c2738e9f0cc61ac7e8b668d4eeec5809407a5dc1eead32103b55e23ba6cf18c78af05900b1f322a4b5f714f3652ad2c1251a6eecf39d74c1b52ae64000000", "020000000001019e80a1b7d28d2aeeb410624efeb4626751910ccc20f1dd4dcdd401db4191f2260000000000feffffff0100c2eb0b00000000160014d6f3837c9b60b2d9e8b51ef4935800a858f5a20b0147522102b700c1c65fe4ff62a06c2738e9f0cc61ac7e8b668d4eeec5809407a5dc1eead32103b55e23ba6cf18c78af05900b1f322a4b5f714f3652ad2c1251a6eecf39d74c1b52ae64000000", "020000000001019e80a1b7d28d2aeeb410624efeb4626751910ccc20f1dd4dcdd401db4191f2260000000000feffffff0100c2eb0b00000000160014244f3257b12821c4d1ad38cd0a1052f69c1593740147522102b700c1c65fe4ff62a06c2738e9f0cc61ac7e8b668d4eeec5809407a5dc1eead32103b55e23ba6cf18c78af05900b1f322a4b5f714f3652ad2c1251a6eecf39d74c1b52ae64000000" ],
+    "refundTx" : "020000000001019e80a1b7d28d2aeeb410624efeb4626751910ccc20f1dd4dcdd401db4191f2260000000000feffffff0200e1f50500000000160014244f3257b12821c4d1ad38cd0a1052f69c15937400e1f50500000000160014d6f3837c9b60b2d9e8b51ef4935800a858f5a20b0147522102b700c1c65fe4ff62a06c2738e9f0cc61ac7e8b668d4eeec5809407a5dc1eead32103b55e23ba6cf18c78af05900b1f322a4b5f714f3652ad2c1251a6eecf39d74c1b52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "785a66316660093c805684beaf8e4755bd9b683d227bacbdfb31e07537679b1f",
+        "nonce" : "c592873ba8f369b709de18189464db79c605e3d45876bd6ac172809b09ca2d60"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-1304922976098312616",
+        "outcome" : "54089e32fca86da43dff7f0e826363b88513b7bf345653c8c45a6f83e6b6f322",
+        "localPayout" : 134643755
+      }, {
+        "preImage" : "-1810654198992477831",
+        "outcome" : "ab145476a3171514169c8fd9140545abd18cef0e04ed656714be044f2269601f",
+        "localPayout" : 0
+      }, {
+        "preImage" : "-1175599216752989091",
+        "outcome" : "30eae1eaf0489ff2835b5539038df67cc302a2f6c03a71cb5f2ad06c1271d60a",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "ab145476a3171514169c8fd9140545abd18cef0e04ed656714be044f2269601f",
+      "oracleSignature" : "c592873ba8f369b709de18189464db79c605e3d45876bd6ac172809b09ca2d60afabdf0a72d0e7e694117b567a73b3c7b9df95145b0047edfc0b9d6df3548c18"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91469e7b259c39b8ccb6100c059a2c984d437e2f2f68700000000",
+        "idx" : 0,
+        "inputKeys" : [ "67d42b7a5aef7e29ba1a100bf44c4db510e52b91b57e8cddcf2959fb2415670a", "73341d958d22d775399a4f3880c87327e33102acb2b50e24837226c40caea17d" ],
+        "redeemScript" : "00203e4ffb8eedd0079c582e66bf02cd4f49da4d0f8a0eb353f62da3874bfde7ac45",
+        "scriptWitness" : "01475221030b00fa0c4d02575cd821bb2b386faa057e30e5dfc9e49309ff067cc7691417ae2103f67a8b64597a4c257d16ef4e90a2c888ef26b86795bab59e3c3a3da697d19d6f52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914fff5f08345e01fb146be2eeedac0cfff0baec8158700000000",
+        "idx" : 0,
+        "inputKeys" : [ "bd0929a6f251a1477e46e8b3c7d6b2e1797ec9dafa70befb29dac14cbd03efa3", "13af2dbc0362527f23b5a8556f77de9f2a200a2dc24d2a2aa4d8964ba552c8ba" ],
+        "redeemScript" : "00202d891adba8557dea066b4774cbbb9e3e46151fba30a0e73b1716a9daec3e348e",
+        "scriptWitness" : "014752210384d4f5355195d3e41b804c8097b64caa8273756db58dcc74cf8fb4feb6b3363a21025dbe3e75e2cff43e04a788c77fd9e2d3fe5e7e2c32242cbb87d14d63ff7efbad52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q84vuxatvkkcrc95v6fnt8ez4rxuj7wsqnrkrqt",
+      "fundingPrivKey" : "ac459e1fdd01f881dfa0a0b080f1f5d512c77f44d144bd8ca17ba6ea681b955f",
+      "payoutAddress" : "bcrt1qjq5d8fcalxqhd3uwv0w3xmc6zu6xsw9sw7wpfh"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020104876d654388384805cf78de355d759bbe0436596a222a5b08f137236ca80e000000000",
+        "idx" : 0,
+        "inputKeys" : [ "235a498ed9929f42bfe07f575763e8a04cfe2b874e5acb588249d8532ad848a2", "f4cbdda272bf0d45b29f3cba2e67876e14669af8e7284269396137d40bfbd9ad" ],
+        "scriptWitness" : "014752210205ccd4e386a9706a5cc3d17d9584422c9a4d8d7441e385e032d0c437bad0e58921031941e6e9cd0f1640389d098f1da698d2e5cde7c9dd9c457c6d751a473cc03dc552ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014740714ae5ef7eb579cb841360b22f209fffe9b6100000000",
+        "idx" : 0,
+        "inputKeys" : [ "295fc1ffa80148e7d734f6886b61f17914c15f364c4255140ef7a93be58d9e4b" ],
+        "scriptWitness" : "02002102a98ce814b18e103630cbf8aaca2b6661011a91014dfb78407febf101286893c5",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014f0929a006726f8f043b1127ad14f92e6d8667c3600000000",
+        "idx" : 0,
+        "inputKeys" : [ "a325bb8de5f7f75b9f9b162000b443ec5a87aa1cdba4e55b32c83059f3185294" ],
+        "scriptWitness" : "02002103536845339db56eb43f69639e51e44c5cc741490d97ab8bac39116d83ac40508c",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b686dccd92a5eed30dd7ad22f5cd0397c40a450a00000000",
+        "idx" : 0,
+        "inputKeys" : [ "a832b0aa15c847ec4f7a314c341fda4ffa265804ac348b2848deb0a214b52007" ],
+        "scriptWitness" : "020021025f7a02c6bbff745f599e96c28ffe3c2a5276825f505b627b90945ae214d1b3ba",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014489c5b80d903bacb973f0d09c5d9c2c2cc41351b00000000",
+        "idx" : 0,
+        "inputKeys" : [ "77bdcc921e36b61b375974e6caed4a528cf38a6d0ae8818e4ed281aacc68cc1b" ],
+        "scriptWitness" : "02002103926e8814ddd7b14fc628a837a693cf3b72f6809545f419633d369237c8547663",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148d7d4d59a1af799ed9f072328859ed69d5c5ecb000000000",
+        "idx" : 0,
+        "inputKeys" : [ "4cce707a12037b061a3189381eaf8bc8cfd0ab840f7330937c9f4dd5382a5f6e" ],
+        "scriptWitness" : "020021035af048c3118f1af1f4517c351e7d5e01c80ab3ebb037014c8791cbfe6ee93c8f",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914035162c491bf028e3aee57e8d8877d5c3039bde88700000000",
+        "idx" : 0,
+        "inputKeys" : [ "37fafe1a60f5713fea80d69f928591c4fcf839adc92de3d8557948f80a561fce", "13bf39630f7af8244c8fda2aa0ce0887fc4df6d043532a56a831d368774ecf3c" ],
+        "redeemScript" : "00207233ad052f93bf38366024d88ad2de7c4e5fb0fd1cdf3df8a26f6f3ad1a44815",
+        "scriptWitness" : "014752210345e7fab044cd3d8074876c6a9faa73de6059bc395a37f7d4dfa8a21d8b26587521034acaf9a8cbb5ff0b729d06450fb4f92edab47ac512bad1fcc9ec00c469a61b3952ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e03fc390bb3cc7d9a3397bfcae34f80579b3aedb5bb7570c61cb6a9b37db350300000000",
+        "idx" : 0,
+        "inputKeys" : [ "da002f0e752339de7e2daefacd8ab577f0ac85b568dc99cdcc2eacf9e824f170", "20b2e2fd151a56ee46f54ab9a61dcbada3e478614c6b5e784ef108c1a32f62be" ],
+        "scriptWitness" : "014752210371d2c43cf0bd6956bbc892b310266c170e0a2eae38207655b3066135944d452321038520a1c9ab531b99880d2bf0fba3d6c45f3c1a303a72a06021bc76e313240abf52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qn5jpws04exwam0jkxf0s35yhwzwrw02fzp6gxr",
+      "fundingPrivKey" : "c6602ae798499f64cce396324b40fd757e0a2a223aa16fbc1e886405d9e273a3",
+      "payoutAddress" : "bcrt1q70nwl5tenx48yy34mpcg8frrzkzukms6693rjt"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "020000000a611866b903a7a429ee589980a2c238e309d75914e132cf821d4e9f8ff4198e2400000000232200203e4ffb8eedd0079c582e66bf02cd4f49da4d0f8a0eb353f62da3874bfde7ac45ffffffff90c9a159b9812d30f4b02977febf64d01a1c0f9e0685e7832de730b7896d10d600000000232200202d891adba8557dea066b4774cbbb9e3e46151fba30a0e73b1716a9daec3e348effffffff7a225de6eac4817a64da19964243f997b381c85026477abe8ec2b7ebcce3ab1b0000000000ffffffffadeb3e8214fd98726959e69685122fce14b3e39129c83ad7c8aab33df9508bd50000000000ffffffff1c9af3ab7147bda25528c8edcdd2400cd518f10de78132790e0ad45ed9f2a4880000000000ffffffffb083f642a8f3a61fbf9678ba3a6abdddf0b0b6c4a45f360fb7a4bc1660a82fa40000000000ffffffffa3ddc52c42480827a1ef4c024eda58a40aa617c51eb046510517a8bec217d3650000000000ffffffff0a980161addbb91b700942a4917a90fdfaab36f7a004b343217092b8c0d646ec0000000000ffffffff3f8a12d82bb48362310399cfe66770eb28725181aa90fba5db13a73d2091461600000000232200207233ad052f93bf38366024d88ad2de7c4e5fb0fd1cdf3df8a26f6f3ad1a44815fffffffff2cfeec6cb04a358bd1c93e7af6bc7133f89e1d4f9065c089759c5ddcaa07d160000000000ffffffff0352c5eb0b00000000220020feac1916badbdaef7e4ec96998c1aeab954f16b327512f6bb5fe995a4b1fb6981c9be111000000001600143d59c3756cb5b03c168cd266b3e45519b92f3a00511f6859000000001600149d241741f5c99dddbe56325f08d097709c373d4900000000",
+    "cets" : [ "02000000000101e4b618fa9e4e4535317edd6d7fe955fdf11150ea486f86cb812b6956f536f1e10000000000feffffff022b800608000000001600149028d3a71df98176c78e63dd136f1a17346838b0d541e50300000000160014f3e6efd17999aa721235d87083a4631585cb6e1a0147522102b58d8f1b153c3749c31f5915ead19ff16e1e52ec93686083edfdb2fb0dc928dc21038e1cc25c03cf9b2a2f49bc0a5041befb20358a9af71cf2b5ee332c0605098f2452ae64000000", "02000000000101e4b618fa9e4e4535317edd6d7fe955fdf11150ea486f86cb812b6956f536f1e10000000000feffffff0100c2eb0b00000000160014f3e6efd17999aa721235d87083a4631585cb6e1a0147522102b58d8f1b153c3749c31f5915ead19ff16e1e52ec93686083edfdb2fb0dc928dc21038e1cc25c03cf9b2a2f49bc0a5041befb20358a9af71cf2b5ee332c0605098f2452ae64000000", "02000000000101e4b618fa9e4e4535317edd6d7fe955fdf11150ea486f86cb812b6956f536f1e10000000000feffffff0100c2eb0b000000001600149028d3a71df98176c78e63dd136f1a17346838b00147522102b58d8f1b153c3749c31f5915ead19ff16e1e52ec93686083edfdb2fb0dc928dc21038e1cc25c03cf9b2a2f49bc0a5041befb20358a9af71cf2b5ee332c0605098f2452ae64000000" ],
+    "refundTx" : "02000000000101e4b618fa9e4e4535317edd6d7fe955fdf11150ea486f86cb812b6956f536f1e10000000000feffffff0200e1f505000000001600149028d3a71df98176c78e63dd136f1a17346838b000e1f50500000000160014f3e6efd17999aa721235d87083a4631585cb6e1a0147522102b58d8f1b153c3749c31f5915ead19ff16e1e52ec93686083edfdb2fb0dc928dc21038e1cc25c03cf9b2a2f49bc0a5041befb20358a9af71cf2b5ee332c0605098f2452aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "5cad082a09cde11bae5f51ed973ac2b3ce2082cabe6539848937a71e5dd6c776",
+        "nonce" : "0add8b2358ce07d6dd4a453a7f4bf9e9b2d49e07c4f334b059d678c7cf077190"
+      },
+      "contractInfo" : [ {
+        "preImage" : "3934555244322946130",
+        "outcome" : "d0e24f25bbc8e767694984aa07e414dfe5c10557bef6ef1bd984ffe1b38ddede",
+        "localPayout" : 140425255
+      }, {
+        "preImage" : "5204213191340129185",
+        "outcome" : "f3c3003c290b8fe1f485de1103aec0c920ef7421a37818761feb914ea90a1d6e",
+        "localPayout" : 0
+      }, {
+        "preImage" : "2691963294600851606",
+        "outcome" : "76e7c17d59a79fc31dbb9b5b6775a632732f26cc76cb33366d3437b83e9f6eff",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "f3c3003c290b8fe1f485de1103aec0c920ef7421a37818761feb914ea90a1d6e",
+      "oracleSignature" : "0add8b2358ce07d6dd4a453a7f4bf9e9b2d49e07c4f334b059d678c7cf077190941b2b30155842b5f50660cb6ef1c6d6674742871cf869ea9f6ea3b8612ce9a0"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ca3ba68bb3850e6b71c770f23ab5441653a950b500000000",
+        "idx" : 0,
+        "inputKeys" : [ "ef4af2e82517a53a0ced3887ee3570444b24f55bb6394fcc03c7d4ea106289d3" ],
+        "scriptWitness" : "02002102563d37cc3a45f3c199e4178b1d81c121f2459bca8d3657394c3353067c98b68c",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020eed6acdc91f8f3ffe6b5bb5f05cdef9a3e66dfa5e6117d870c1bb29f74a0ffe600000000",
+        "idx" : 0,
+        "inputKeys" : [ "219967f18f239a5f704510e7f018dae7529472ea6188d12def2c2dee11c7e549", "6670679dd9f7bb02edbf3760c621e59137841c0f0a366418d5ab95ca61523d92" ],
+        "scriptWitness" : "0147522102aeaa1a9207c06bc4430d9ab73641f0c8479bedfe25f5ee16a2602393da9b3eb62102498f0d2887b00bba0436485eae84ce1818328287758a086517aa3aad7692749752ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020412c896aef3c5808f07e8f963b5e3ca4325d815df5993a358fc48b9f1feac78d00000000",
+        "idx" : 0,
+        "inputKeys" : [ "ad063ffcbfef41c8ce3bb0e193475025ead409c8d5cadb9ec725ed38d90ba1c9", "c300c061f6e9611684a3a9931eb74e3bf05e77ef2fc6acee90a10edfcbe2c4c3" ],
+        "scriptWitness" : "0147522102d0e3d2cb4b06cef24f009e4e4c5559615e00729c1ef92275b9a88f15629dfdc72102eeb33b1058a5ba6153bf3e4d4804a4aa9f0997fc8ef3a9ad98d231244e409cda52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qlq6fe8lp00upy0wvjgu0fxt3mhdh5kfnp83d02",
+      "fundingPrivKey" : "817bb05b3d76093bfa3991441a62c5d6773acd5f1b4bc7e7d10d85966ab8c71a",
+      "payoutAddress" : "bcrt1qj44f44tvjzlff87zdxhz8gpzn3a795x8v7x8z2"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fa6e587409a1fe9843f48c92555bd2709d4aa20900000000",
+        "idx" : 0,
+        "inputKeys" : [ "e81a335903935b537d253cb0d7c7e10ccb980f2682a3d06d22267a1e46c8464f" ],
+        "scriptWitness" : "02002102c1866867d675915c410366a9776c10ef40d5abbd6b9ccc19e0f293c919979c98",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qz63ztm6yrewsklzcglf373ddwjyl9k0qu5hww2",
+      "fundingPrivKey" : "87d3f9b9eb9329c4a139c375226abe4a03988cd93b595297c4958611d07919b7",
+      "payoutAddress" : "bcrt1qg830zhyndhmjrmtpfypxy0p8javwn83zmmhela"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000004c92d95d6eb5861e64fdc82e7f42ad7b9d600212d50ec008963b669c298f9d70b0000000000ffffffff0487ede92e49c2d0b351063057acac2032506c7633a1794a1134e9d385a658d00000000000ffffffff044d7a42eb77619a2129baf1d002a0aeda49e11686a69bb5bbaa1c8fa7e534780000000000ffffffff146923a54fd466bedcb28d328d251a5b63682e1778f7affad4de0899f2c2012c0000000000ffffffff0352c5eb0b00000000220020cd240bf7d9f758ed90fb7ffb578696133d4223b4502b4f8a88d4c06d2a1aea63265dcd1d00000000160014f8349c9fe17bf8123dcc9238f49971dddb7a5933e1dcf5050000000016001416a225ef441e5d0b7c5847d31f45ad7489f2d9e000000000",
+    "cets" : [ "020000000001013cbb7607044d4bba50bfa9fe2793455c74fc8f877bfb9b39f561749ae82b27480000000000feffffff0227b85e0800000000160014956a9ad56c90be949fc269ae23a0229c7be2d0c7d9098d030000000016001441e2f15c936df721ed614902623c279758e99e2201475221039d06ef7213724d7e90c9bc58c85cecb40e6fd0dc7c41ca89ad0e3002e215a9052103bdbdd3724a553b9f0baf76276a643f676805ac11d86199fc7baba2639936b04e52ae64000000", "020000000001013cbb7607044d4bba50bfa9fe2793455c74fc8f877bfb9b39f561749ae82b27480000000000feffffff0100c2eb0b0000000016001441e2f15c936df721ed614902623c279758e99e2201475221039d06ef7213724d7e90c9bc58c85cecb40e6fd0dc7c41ca89ad0e3002e215a9052103bdbdd3724a553b9f0baf76276a643f676805ac11d86199fc7baba2639936b04e52ae64000000", "020000000001013cbb7607044d4bba50bfa9fe2793455c74fc8f877bfb9b39f561749ae82b27480000000000feffffff0100c2eb0b00000000160014956a9ad56c90be949fc269ae23a0229c7be2d0c701475221039d06ef7213724d7e90c9bc58c85cecb40e6fd0dc7c41ca89ad0e3002e215a9052103bdbdd3724a553b9f0baf76276a643f676805ac11d86199fc7baba2639936b04e52ae64000000" ],
+    "refundTx" : "020000000001013cbb7607044d4bba50bfa9fe2793455c74fc8f877bfb9b39f561749ae82b27480000000000feffffff0200e1f50500000000160014956a9ad56c90be949fc269ae23a0229c7be2d0c700e1f5050000000016001441e2f15c936df721ed614902623c279758e99e2201475221039d06ef7213724d7e90c9bc58c85cecb40e6fd0dc7c41ca89ad0e3002e215a9052103bdbdd3724a553b9f0baf76276a643f676805ac11d86199fc7baba2639936b04e52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "fcdc6920743070694b5b98b8ba4a80163c647813620745541bdbdcd26a1e9184",
+        "nonce" : "cf9524461b4c74d3a5596dfe57f0e3ac379018b16af274c48a0ddb487c95ef34"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-4433314534670692301",
+        "outcome" : "e44ee40699550da02f6376ea1d1ffae6dd390a56a05f4620ed69c17a907128b4",
+        "localPayout" : 98069162
+      }, {
+        "preImage" : "1581360096782273206",
+        "outcome" : "ece9516f04803b78868acc1d58a87ef5ff2353e3af0ad9e2c703583d1112315e",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-8322539809162522645",
+        "outcome" : "416f3c9456bc67b4697b7d808708e6550a30024f63b9b915e84af8b5d604c8f8",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "ece9516f04803b78868acc1d58a87ef5ff2353e3af0ad9e2c703583d1112315e",
+      "oracleSignature" : "cf9524461b4c74d3a5596dfe57f0e3ac379018b16af274c48a0ddb487c95ef34aca0090b4b296e5d7afa74775a9ee51273c869b064240f1b173b0a51e6a945c0"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020f033db130c2b972753f18a46447e1ef964615112c6704c974e20f4bddeaca0d800000000",
+        "idx" : 0,
+        "inputKeys" : [ "0265402f6a9030114720f1ad768f6b11c806086a9e3c5e0216bcbb268837be27", "51865cf6b341f691e06c51977cdb2414eee9d0419d87a67092471cb4497e3904" ],
+        "scriptWitness" : "0147522103d49fca9b40514c0720e4fe74924217b925ec59a362a96e4cb8529013987e963d2102e273fc2bb82f197717e8af23f839ba7f1711f4e40b545d9d4cb01119ee7d959a52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91469497235bb87ea0099cac5ca5d1a9d1ff630de908700000000",
+        "idx" : 0,
+        "inputKeys" : [ "66f721edb6e73ca517996a0e9ba0e5c71d22fee015c6e1d5a33da71bf1301302", "b1d269dc0e6e30f544b6587dc3dedd587b2aaf7393a7d9fd8d09c207f3bba38c" ],
+        "redeemScript" : "00203f2b373095bf1d09fe4ca6f033279a69a5dcbec7dc15379a0b1126ff4459dab5",
+        "scriptWitness" : "0147522102a0d6b8f4b76b3d34436f8a3683ba322b08bb03d21df0898b5528fe14a894b88321029fd82cb6ab4ddf02da977a23f841ddd7b6965fe1acf0240908f1c1e46c4e5d5452ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143f1e04f9b4c1305064cb9d495c81c9aa016ba92000000000",
+        "idx" : 0,
+        "inputKeys" : [ "92056d780de8b4bd94a02e8793a3405d4c7c38804d2903b48846e09597a8812c" ],
+        "scriptWitness" : "0200210247b151610dce31b32e3824732d0ca0f63f1f95e19cf60aae23a2077ac4208162",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q9klddcjcj6zcnulpyfaahddkzea0mx5pqedwp7",
+      "fundingPrivKey" : "1d9d7960f9b90098c30e181aeff2776c51b06cc0f814e32afe0160e2e0eecbc9",
+      "payoutAddress" : "bcrt1qgksfw9jq086uwh7zl5mans3r46phwmf73e2jr6"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014d7adb4837207c92ce88bc5c8b56c987ac7766f2700000000",
+        "idx" : 0,
+        "inputKeys" : [ "97b1e11df35bab415454c2a47f315d796c6dc956e1785844903b400bdacff88d" ],
+        "scriptWitness" : "020021028e8dcf93ad775898f8ca0dbe2ce3137dfdce220e499153921dcef7aeaf04edb0",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914346802093b9fdc6483e1f2037b4c502cd92efb1f8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "f1f68c6f8c00c9506338653d2f50f8b192539fa487bb31909d673ef897662e34", "e685989230222860b6af75fb1e61d00426dab7e5fe1c1f27bb3a9501b09e9066" ],
+        "redeemScript" : "00209c24c9957289cc30ddc2118b4e0de7d1d92e7f112ff1b4d5b9887dd6b236fa92",
+        "scriptWitness" : "014752210397b72e1825fef7b988e34d991d520727e4c68981b395bbee68a8e936c8b281bd2102784420c9eb31d4dc61e5007ebbf96588af16cdd853631a73983ddacbad173e1652ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q7kh4qw5aw4s4cpffejm3e8cqkmfeq3503gnppg",
+      "fundingPrivKey" : "3567b08d30a21e6f8cc830415139926dcf643e6bc3a312ee2653c8890e4768bb",
+      "payoutAddress" : "bcrt1q8rjufv660xcr4j7jv3pekdgvjf2pdfq9a6hs8p"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000005e656e8279086369c315e31321e556ccac2dec607e57d77e4d2fc9844319794690000000000ffffffffffa24a6dbd18f9beb45ea05596da11058024e6e55bbc4bdcefe5472281c23c8400000000232200203f2b373095bf1d09fe4ca6f033279a69a5dcbec7dc15379a0b1126ff4459dab5ffffffff68efb93f5a6c68264aa5d7cfbe812ba42e43bc1ed0ccafdc99cda5bfe82956d20000000000ffffffff67088242eb6623a4b83c65f93716f07ae0ca1f6ae520f51919c51516b10a21b90000000000ffffffffbad8d3dc205e660c7aa99fec879746266d53bc4b790f9cf657861a83f6e1e69500000000232200209c24c9957289cc30ddc2118b4e0de7d1d92e7f112ff1b4d5b9887dd6b236fa92ffffffff0352c5eb0b0000000022002055fbd0a6d3eb799edcc05070a2e4a354e6c9a31c9c6ee0f12a229dca678d3e39775ccd1d000000001600142dbed6e258968589f3e1227bdbb5b6167afd9a81579ce11100000000160014f5af503a9d75615c0529ccb71c9f00b6d390468f00000000",
+    "cets" : [ "02000000000101587051b111aa45194dc939672558ca320c977daef3f0ae9d58fc94e4c926bcb80000000000feffffff02aa6ad8050000000016001445a097164079f5c75fc2fd37d9c223ae83776d3e565713060000000016001438e5c4b35a79b03acbd264439b350c925416a4050147522102b3af76d9abd0e5fc8ebb9901062c81068d1d2b3b15eb1568e873c633c8f5600d2103ede081891bff261ffa86b5ff4fa384000a55879e4f2bcadb53b37c78cac5df9e52ae64000000", "02000000000101587051b111aa45194dc939672558ca320c977daef3f0ae9d58fc94e4c926bcb80000000000feffffff0100c2eb0b0000000016001445a097164079f5c75fc2fd37d9c223ae83776d3e0147522102b3af76d9abd0e5fc8ebb9901062c81068d1d2b3b15eb1568e873c633c8f5600d2103ede081891bff261ffa86b5ff4fa384000a55879e4f2bcadb53b37c78cac5df9e52ae64000000", "02000000000101587051b111aa45194dc939672558ca320c977daef3f0ae9d58fc94e4c926bcb80000000000feffffff0100c2eb0b0000000016001438e5c4b35a79b03acbd264439b350c925416a4050147522102b3af76d9abd0e5fc8ebb9901062c81068d1d2b3b15eb1568e873c633c8f5600d2103ede081891bff261ffa86b5ff4fa384000a55879e4f2bcadb53b37c78cac5df9e52ae64000000" ],
+    "refundTx" : "02000000000101587051b111aa45194dc939672558ca320c977daef3f0ae9d58fc94e4c926bcb80000000000feffffff0200e1f5050000000016001445a097164079f5c75fc2fd37d9c223ae83776d3e00e1f5050000000016001438e5c4b35a79b03acbd264439b350c925416a4050147522102b3af76d9abd0e5fc8ebb9901062c81068d1d2b3b15eb1568e873c633c8f5600d2103ede081891bff261ffa86b5ff4fa384000a55879e4f2bcadb53b37c78cac5df9e52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "93ac5d71510cd89aefc49149d8d9280a029021082d1332b9046723fd6dd869db",
+        "nonce" : "5fe68c2690fc94a28f5957db198ec7d17cecc03c53149a2765d035348d1d9ab0"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-2860241903555639506",
+        "outcome" : "798dffbef81456499b025ac58ac8f9e885821c9f40e92de421defaed5b9f2551",
+        "localPayout" : 0
+      }, {
+        "preImage" : "5550694627404132930",
+        "outcome" : "9092b5ed9e35ca832bef7494d1e1a14ef938e1968352f3cd8f0fb261e85a4f30",
+        "localPayout" : 77817481
+      }, {
+        "preImage" : "-7884928063193393714",
+        "outcome" : "496262caf94d3a65153d563b8f7e3ccd8d9130fcd697197d9b32875b5b54a476",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "9092b5ed9e35ca832bef7494d1e1a14ef938e1968352f3cd8f0fb261e85a4f30",
+      "oracleSignature" : "5fe68c2690fc94a28f5957db198ec7d17cecc03c53149a2765d035348d1d9ab0a91294d60eecdc97a1d2dc9ea0bf572d3951c1b1bf918b27581537c619d78ccd"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002011fa77d954e333a73fa7bdb1651607b1f415e43dca12ff19b899ba2ef8d5fa9700000000",
+        "idx" : 0,
+        "inputKeys" : [ "f68f2f5ade3875e286ec0940903b8a0db6efc4fe70df3517d671f798a71fb8af", "66ca311abd8fb100e38b9e15a47fa1ae2e318fe9851d194a2b36b2c86505c6b0" ],
+        "scriptWitness" : "0147522103c9497349202d143e206aaf62ada97d670f211f8187560a5d04e05338ee8c5a6c210290096fe1f15e4a8dbda4b37f1328cdce4bc198c81c7691249e8b37f87d30536852ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014cbc9e2679593bffaca4ae977e08f103f03d9217b00000000",
+        "idx" : 0,
+        "inputKeys" : [ "640e74aca479e46dede870f117694a6f5f7bc0681822d81d05fe4a45855b91ac" ],
+        "scriptWitness" : "02002102933ab85cee0a317d9bcf95e196737341bc4fe9e5f9aea4cd9cab67adb42004cc",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200207bac9b92f9a6947f175cc37796d15693f09a92b72f97f88e59cb7eb4beae7d2b00000000",
+        "idx" : 0,
+        "inputKeys" : [ "5e81071952e70c62e75ec548993d44fa81c7441e9e9686f966b3eb991768a843", "6c214d69b60b76345767311ab64a26a57c239d0203768d48d6eb07c6cf2a173a" ],
+        "scriptWitness" : "0147522103c01e1af3cbad38f055463e376e4fdb6b86e7e166447562c36642d17a2eb3ba3f210266a5f620e0f97f89f4f550a9a1a3e506f9cd8fb8aa894263bb7dbcee5b955f8552ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qutze54rtykzan3pgzvmxak2rh5gp3teyhgfry2",
+      "fundingPrivKey" : "d1c4cc1e08481ad884eae6efabe161c4ee24d2c146e844059ed599d9c028b4cc",
+      "payoutAddress" : "bcrt1qlyqtkytqmyrt4mk43t6llpe9jp6zk3x7vf79l2"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91499d392729f32f75caeccb6a1830979c54eba41da8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "a1046c2097da20bd003a410dad533fd3d50ffff115e8307bf3ddd1950c322424", "5e0273dfa3ee8cdb77dd0ab575141a6bbc5eecae46ef4c0d1c171a559233af3b" ],
+        "redeemScript" : "0020b75a9b15644cdc3bd527f052623ef403cbb66b8fa1d2affe7e2dd3d56ef2b076",
+        "scriptWitness" : "014752210295a6450cbf8cfaf6725f38d9466c002ed19d254e995c16d53e4a3c899c7670672103e3d1e76289d74e9b74cebbfbc45023e1fa1e39e919c2e0b09e4fd6de25cc04b952ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e641d7f8f016e87759990435f00dc0b593802b2800000000",
+        "idx" : 0,
+        "inputKeys" : [ "ed5e72ae2c56ae64040a6ec614cfdb18ac73c243980be29a6b88ce2af79b1a78" ],
+        "scriptWitness" : "0200210351fea567816e9938fcdf123ffcfb3968c188355f4ca828374d39b8be50ed0352",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020996660cde5caa0a39db44645fd49d5934101ca77cbe66ba4585b6ebd112d8dbe00000000",
+        "idx" : 0,
+        "inputKeys" : [ "3d7d8cbff6d3712b7bbf54e4967edf70aa5e75bb4a29b47697e0f7e27b235812", "d78292bb17fb2c027262c51ac9f8e3619644495f0a578380da1701a123cccde6" ],
+        "scriptWitness" : "01475221037e6179a2194e6e71733bb722596c6925f7a93db9db977afedcc161e763c377cc2102d26eeb46aa671b60c0739b1e502ec61097e2612a455dde323c3d3087e3301db552ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qfq3ptz8gn88plewjglm24xr3czgt4vhnnw7nvg",
+      "fundingPrivKey" : "8397ef4ca4a3cb9d8132d5a6f6dce4f4026eeda388a478a94b9e3f4fec6998a2",
+      "payoutAddress" : "bcrt1qz20wl37ulycsjerux7da72zz93zs037lc3cts0"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "02000000064d51de25f8ab5661705ac87b6f2c39de37dcba93692cdf4ab087b5b4cdf833d40000000000ffffffff319dbc903d2416483f65496c56d457929f891ead54ef4900ee1a26dfaddf6db70000000000ffffffff6f5e563f6539d1a9436f0444db246edf92a72a5427ea68f70de6eef864470dde0000000000ffffffff79d1e161887746a78eef3ee5d92f63af0d16f987d469a95b2628662b7f6a1f7f0000000023220020b75a9b15644cdc3bd527f052623ef403cbb66b8fa1d2affe7e2dd3d56ef2b076ffffffffbf42d454d3190cfc189ae8e67d377a2536569c32bcf13c4d700df960cbf96c1a0000000000ffffffff5778a79697ed1092af87ca73c6269f2101e3dcbe882e1047aa8301a1ecb3cb400000000000ffffffff0352c5eb0b000000002200200bd53324a2b2dbc3fc9aec03f1e76904b528459fad1480e81ec387d698a3c2df265dcd1d00000000160014e2c59a546b2585d9c42813366ed943bd1018af24775ccd1d0000000016001448221588e899ce1fe5d247f6aa9871c090bab2f300000000",
+    "cets" : [ "02000000000101f4dba77d24cef539ccb4b35920877323ce4953a805dfe072ebe6ce2980bdcfe20000000000feffffff0100c2eb0b00000000160014129eefc7dcf93109647c379bdf28422c4507c7df014752210249724dd02442039a6909e0263827f2be4e0d02d4bf0f6626bad2e7dae5c3f5c82103efaf9d0bd13266c5ab1ed8900107e38693f349695ffbf1aa9869c6d41e688bb352ae64000000", "02000000000101f4dba77d24cef539ccb4b35920877323ce4953a805dfe072ebe6ce2980bdcfe20000000000feffffff028966a30400000000160014f900bb1160d906baeed58af5ff872590742b44de775b480700000000160014129eefc7dcf93109647c379bdf28422c4507c7df014752210249724dd02442039a6909e0263827f2be4e0d02d4bf0f6626bad2e7dae5c3f5c82103efaf9d0bd13266c5ab1ed8900107e38693f349695ffbf1aa9869c6d41e688bb352ae64000000", "02000000000101f4dba77d24cef539ccb4b35920877323ce4953a805dfe072ebe6ce2980bdcfe20000000000feffffff0100c2eb0b00000000160014f900bb1160d906baeed58af5ff872590742b44de014752210249724dd02442039a6909e0263827f2be4e0d02d4bf0f6626bad2e7dae5c3f5c82103efaf9d0bd13266c5ab1ed8900107e38693f349695ffbf1aa9869c6d41e688bb352ae64000000" ],
+    "refundTx" : "02000000000101f4dba77d24cef539ccb4b35920877323ce4953a805dfe072ebe6ce2980bdcfe20000000000feffffff0200e1f50500000000160014f900bb1160d906baeed58af5ff872590742b44de00e1f50500000000160014129eefc7dcf93109647c379bdf28422c4507c7df014752210249724dd02442039a6909e0263827f2be4e0d02d4bf0f6626bad2e7dae5c3f5c82103efaf9d0bd13266c5ab1ed8900107e38693f349695ffbf1aa9869c6d41e688bb352aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "cbb868a282adf475b494414c0aa27c63f1bb9ec70fe0ca0edb27fd13c5e08c10",
+        "nonce" : "dc79fa50ebcebf681049ebee4f0f2f65a84166d8ae0a2155f920d9cb4970fbb4"
+      },
+      "contractInfo" : [ {
+        "preImage" : "4544391953555568416",
+        "outcome" : "5f5836d43285c12673c2e595c371f4d8c4c9561104086100d0a27d2dd5e2b584",
+        "localPayout" : 157758230
+      }, {
+        "preImage" : "8080010761764790180",
+        "outcome" : "50cae17fa326f1f4834e7d8958575e984652c4a54f70082a0040c5451ab6f09b",
+        "localPayout" : 0
+      }, {
+        "preImage" : "9207698247640169180",
+        "outcome" : "cfe81d5b48d6cccf9dce2ad2f487314292ea9764bf30cfa4126529a8938fddc6",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "50cae17fa326f1f4834e7d8958575e984652c4a54f70082a0040c5451ab6f09b",
+      "oracleSignature" : "dc79fa50ebcebf681049ebee4f0f2f65a84166d8ae0a2155f920d9cb4970fbb46bfabc409a9f2f1b982e776d808b01ca190e1a3e240036bde43dd312b045d150"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ebe098a6f1435a18f61ab640359e4e26e6ce8b518700000000",
+        "idx" : 0,
+        "inputKeys" : [ "392a9ca3cefac8c216a3a946bc957d3dd7cc4cb71b5bf60014adb201a3836a49", "f84f66ee0a63ca772736faeb4c7eb2386d16e73e97f33a3ee284b5885cff3547" ],
+        "redeemScript" : "002017a28323c56f6f3e92a2d3455d0076bec7da5c960fc5a053a84b1df3b38cefc1",
+        "scriptWitness" : "01475221026027f2608bed3aa5032a9102d4b572744e0ec045deb5e3aa60b36a4e3218f4da2102dad9cb179798606f2cf358b934ac05421864c0e2a4ea725834ae16b68fd6b95952ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148f31dc6dacd2575813742ccbb5c47c76be79c10900000000",
+        "idx" : 0,
+        "inputKeys" : [ "17f75c31fb1a042516d0fb5cc6c8df6fe4d0ae9b1305586641a78cd25b65996a" ],
+        "scriptWitness" : "02002103fd6887e97159f9d982107bd30847fe31b9a0681c10b1373f60fd53e047f9213f",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001482bc1ecbb3f961397fc2fc0eae26fb0bda22635d00000000",
+        "idx" : 0,
+        "inputKeys" : [ "b95351bc77a69f1f07d1a49c11642a358c554319d8e72ea4c8d0bc71708df785" ],
+        "scriptWitness" : "02002103c674199b61785106a38788f0db5b22e912b3c1a3af5eff31252bdfe9f6f517f8",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1q4lvfmwk4v0cm320sdcaraqww7g724d7xu42mzw",
+      "fundingPrivKey" : "e0ccc87ba1421be90d73823dc2f639b0c5de1679f18e55d26841d667e62ce9a5",
+      "payoutAddress" : "bcrt1qsq35senquuajy9gp4f3lgeg3veatw9u8nd5fak"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001443949b12082432172d70af36c1be536d96c0790300000000",
+        "idx" : 0,
+        "inputKeys" : [ "4a34f2c1077398c2f7f33f986cceed79ba90bd991f4ee7746fc8a15e0d6f28c8" ],
+        "scriptWitness" : "020021027435d5121740ebbe711e1fe61c56f21fb5ed358a2d95abcacadbbc96a74bfb4c",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020fb2fe0294dc016f1da6be1de6fad7f08455e85479596cf51698683f7de6592be00000000",
+        "idx" : 0,
+        "inputKeys" : [ "39450a746b2e3a93d81a93be84e4be0b0786e601c145340ff7f1a8fc5e34f284", "c31299d822f1c160547087e86ca1dc08fc4cdffdd16379a800fd674690aee94b" ],
+        "scriptWitness" : "01475221037e2b0084041ee23aa858da083bd5c7970cfb8fa8dc5f1644896de9a8545aaa3e21022a7a2c0f5913d82a2db046091826bbad5da1944e178a1e4ff1c2f3572358ff6e52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148510ed7297083e003f98a8ff9bcdb538376e95b800000000",
+        "idx" : 0,
+        "inputKeys" : [ "b9abe838de831a17ff88e398b59e130abd9e72539480f8f49892fa3a16924a57" ],
+        "scriptWitness" : "02002102e6fba8ba953994b38985eafcc1390625050ce486a6c83eeb13d3eb9af9da3ad4",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ac0607ab903330f3601617076eea95f6124ccac8a33a0c272edd6822f564ffda00000000",
+        "idx" : 0,
+        "inputKeys" : [ "1b84cbb23df32b421582b7b1b6dc3448a9307104f3c7e8836a75a1d456dff82a", "cf5492b21b0869f8a4ef7aa625cdc4bf9456e4ae675aa9fac0895d4c0a33aa4d" ],
+        "scriptWitness" : "0147522103cdbe36b5c821527d73d944baf3a7c4e68e1b9b7cf39865611b40aa418cb6de1021028675d661bdca709d6cf6bbba63e5f1689948ac52e3d38ffbb3eab1f672e7b02e52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020c42c2f44167e9fed08c228056ae083fd4ed29b7d22572edcaa39762dc8c1802900000000",
+        "idx" : 0,
+        "inputKeys" : [ "35031da729c2710ae06384cec3ef62334b864419d0e1d09f1bef7b750f88e5e2", "f2a41c776d0fea2b6b75548d3d5bc73d32e8cc057d89c0e550902f3185ba8d9b" ],
+        "scriptWitness" : "01475221037e52d089cc9e6908bfe810a3b89651eb685cb63c47810e6398625b8c75437bbe21037015b47269bc69f085a23ca348b1ae856e6c36b6b86f776794372a19082eac9752ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e69c4e3c7c4bf488053e5b584bb8f9c13a06383400000000",
+        "idx" : 0,
+        "inputKeys" : [ "1e0681987aa0ccb0ca38a1db6909015b833aa6c7408cfae2fcfc2d5101951357" ],
+        "scriptWitness" : "02002102e4232940f682f46aaf068a153c0b5e07aaad34b7f51a730ac61cfd1cc83a6a83",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600140ecc1896d6e7932bc317980c6ad592b90a7f7ea000000000",
+        "idx" : 0,
+        "inputKeys" : [ "d1bd4da1a8f85914332365c36ee85f9509eacb8f609f245dff2f7bae86c1dd36" ],
+        "scriptWitness" : "02002102525b4f19d61c6701b0462284edce52afff8cd5e9282623a5bf8c394baa63096e",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9140085451578277a8f913f9c646246e12f306c0bff8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "aecb48f77647a4c91cda6b6c45550a026e7b8117f189df6b2810a335dd94eb45", "a5b160317ed0b7227e76a24219cbd2fa1529cb2cd410dea820c1864bd3aed5ff" ],
+        "redeemScript" : "002005173f81562883b7f7e65bef2a1a8eb364314dda97794c4d8eb048792d3773a7",
+        "scriptWitness" : "01475221025422a84aee7d19bd29a3e499a8f091515e7b7f22e97762b92e9051e3bf4b0359210218815504f0db6a971153173d9ee58b4fc2f3ec604ee89ac1c14623ac3cc6625552ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qa89x4gwr4y5xw7up7n2m5jvkdtjee8dkqunhmj",
+      "fundingPrivKey" : "5ce65e9768f431e3b90ffcc9509d737adf262ac07f0e40d519c258fa3d0d0434",
+      "payoutAddress" : "bcrt1qqd5fdpzk0utum7ur0tk9g78jsqqy4l0fds36d8"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "020000000b6073d704c46da2e723ff4d717d289f88cdc94e3f36f5bb9c82d76404a021afc0000000002322002017a28323c56f6f3e92a2d3455d0076bec7da5c960fc5a053a84b1df3b38cefc1fffffffffc43b63b1d5917b8584ee53935ef21a0174f60f0d43352878d38b6dc6a028b360000000000ffffffff03655ee44734408751fc78074318648feaaaf735ab6d91af7a30098d270568d10000000000ffffffff9de54194da5c58fd9bfffacec386ecf7bb728d7712058060c7dcb100e430dea20000000000ffffffff4cddf28015778bc75b2e61b2da1f15a91447992d40ac0075ad059693a7cfb8470000000000ffffffff00169fda41fffab871890c174e6f9f776176a03a73effef0488167fca25ea4880000000000ffffffffde4c5edabef65554855fd67027b39b2b0c0265955ef6117bc603e6c5a5a6a4720000000000ffffffff731f9ffb528284043f28dbd70559032e0ec1b69cbeddbc8738e5eec8db1343040000000000ffffffff231bb41ec08eec59e22ed3103703e5091e5ac7a164f82f2943cfb145de029f010000000000ffffffff18bb541d491bc2086ad228799694a5b60251db6015a8384f6c0018d95a0851630000000000ffffffffc8a78b2d920bba407ead27b2791c49465960f9f48ed390666b5f5f04bce8302f000000002322002005173f81562883b7f7e65bef2a1a8eb364314dda97794c4d8eb048792d3773a7ffffffff0352c5eb0b000000002200206fda5f81e4988ef373d085d39eecda7611bf1c419d75317522e194c12f4754e2035dcd1d00000000160014afd89dbad563f1b8a9f06e3a3e81cef23caab7c6c51e685900000000160014e9ca6aa1c3a928677b81f4d5ba49966ae59c9db600000000",
+    "cets" : [ "020000000001019acac086845dbf7e07d0ad1dae7987ef989fccb9a9ce3aef7ec2ea228b78989a0000000000feffffff0216336709000000001600148023486660e73b221501aa63f46511667ab71787ea8e84020000000016001403689684567f17cdfb837aec5478f280004afde90147522102d1bfecee5fb0b48fd4f1eb18b266464d4c0f32493a603edeab51c28ba179e2802103d42d8d22749f8efae492cffa04b252233036f4a234e4f2ba2d4f88a68e0f29af52ae64000000", "020000000001019acac086845dbf7e07d0ad1dae7987ef989fccb9a9ce3aef7ec2ea228b78989a0000000000feffffff0100c2eb0b0000000016001403689684567f17cdfb837aec5478f280004afde90147522102d1bfecee5fb0b48fd4f1eb18b266464d4c0f32493a603edeab51c28ba179e2802103d42d8d22749f8efae492cffa04b252233036f4a234e4f2ba2d4f88a68e0f29af52ae64000000", "020000000001019acac086845dbf7e07d0ad1dae7987ef989fccb9a9ce3aef7ec2ea228b78989a0000000000feffffff0100c2eb0b000000001600148023486660e73b221501aa63f46511667ab717870147522102d1bfecee5fb0b48fd4f1eb18b266464d4c0f32493a603edeab51c28ba179e2802103d42d8d22749f8efae492cffa04b252233036f4a234e4f2ba2d4f88a68e0f29af52ae64000000" ],
+    "refundTx" : "020000000001019acac086845dbf7e07d0ad1dae7987ef989fccb9a9ce3aef7ec2ea228b78989a0000000000feffffff0200e1f505000000001600148023486660e73b221501aa63f46511667ab7178700e1f5050000000016001403689684567f17cdfb837aec5478f280004afde90147522102d1bfecee5fb0b48fd4f1eb18b266464d4c0f32493a603edeab51c28ba179e2802103d42d8d22749f8efae492cffa04b252233036f4a234e4f2ba2d4f88a68e0f29af52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "d749033a7eddfb846cd832dbe456e9e429dc3fa49829dd5491685caeb1559cbf",
+        "nonce" : "0c26f9f172981b3f4c995647e13004b7174fa720680a4b452660dd48cbc96bfc"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-1659167550529929111",
+        "outcome" : "63f8399081394b58e4250b65258a6a4b8bd05e1bf72dcfa8d48b688e8e26d1d1",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "6219388935345628528",
+        "outcome" : "a14802052d0b0b468a9c03f114f811914a76dc648b923f6ff77622ea290cc97b",
+        "localPayout" : 0
+      }, {
+        "preImage" : "9217239319575883915",
+        "outcome" : "f63450f6b1181c1de5f88804de43d5b63ad19954a82d5c0334734c8c7769d4f5",
+        "localPayout" : 9677875
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "a14802052d0b0b468a9c03f114f811914a76dc648b923f6ff77622ea290cc97b",
+      "oracleSignature" : "0c26f9f172981b3f4c995647e13004b7174fa720680a4b452660dd48cbc96bfcea182c6dbaa9d29c7362cf752499c50cf04db333de24a7b9f7f4f905380bd3e0"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208809d1371bdcf3a474fbc824ea6c1fbe301ee73e193f103fcc18f023f1c3901800000000",
+        "idx" : 0,
+        "inputKeys" : [ "ff47336df5a3c04ff7210c5d2638262c82c6056642d2cb0d8d629b0aae8d3f23", "e59495fb894d96a6704f5f85f7da1f9ddfca737ba91ddf32792668a300858d80" ],
+        "scriptWitness" : "01475221034e9e9d9552193973ed2d4414fdd82ade7621a5e2c18b39f7d37410cec427d94f21032852e5904e6cfd60e9c47895d0ab798e1734a764c0298fc100e70dfd6854c62952ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ab446c7102a98e2786689c22398bf3e6b3a82c69682171dd465e5b99e51e487c00000000",
+        "idx" : 0,
+        "inputKeys" : [ "ec03b2b063d00672532eb7634f9f42ac7e3e85d67d853b31712c0f5bddc15524", "5c4cef4427abc8563b344d15481a0a49b47f7f11844ec7fbe192888b3faf7c56" ],
+        "scriptWitness" : "0147522102875de586a5cba38dcf05c76364decdccd2fb89e24365753b9c34bacffc3f14852103bcda93ee6a454a6ad330207190c53c1f8f974c247117e40c64f91db0f0c9d6ad52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200204f571eaf9ec4a3cbf1695845c07fe9f060531a456d4fdcf747f971955a52c9b500000000",
+        "idx" : 0,
+        "inputKeys" : [ "a62b43e57e3fed03313fe03e3fb3ee9e71d44afbef98eab16352e8c879e11c3a", "05a2e00d038e5c20ab09d339a37697eea7ba1967626e101df50bdd0837d6fcf5" ],
+        "scriptWitness" : "0147522102f2bc20f7f9bd697f55a696b20c041ba77480184bb184b1d78725f82878c63df4210265e542ba81d3d59d34d072f7d81c99a4ce0072db602e0ba796b804fa61b149e252ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91474c2fe1624092cf5d9280c517b2d2e89e630e38d8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "39dde32ec3a098ff95b336e7b2c596bacf0ec9b027e8b4a634ba5b96acc934ad", "c4635cc9420f97d7a8011d78e30bd711ed0a84d215d9da25c95dc12e3aaa4b68" ],
+        "redeemScript" : "00208afaa056f90ad79e17cf6d9b971ec8da35118000d0d5a938f196c291d6055d9c",
+        "scriptWitness" : "01475221031a25fe6d3001e7f680c1b5595cd9ecde5584b4d9ef20a96558cd87cf649c0cf62103b83456fca32fa8394c2b4b0998a4a62e408aada840e3c5a72eb3d7f8d292299052ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020d55baae178af77cd7be7680276410728e9ad634331c828ceefee7b3d1eb5e5a000000000",
+        "idx" : 0,
+        "inputKeys" : [ "95c29ade047b1cb5e0b5213e7f5efa9d9cef926a60a14de85ee84c4e39d3f8b4", "aaa26e7b6f925da7f9b4c0a213e3ac5893971db5366ffb7ccb98b89c8563c76b" ],
+        "scriptWitness" : "0147522102c23a1c79a73f0e5aaefdeaba840a1ab0500d683721d63bc63c6d19c9d57b467c21024b814cf2f5ced3168620f21b2928799c42308f93bb50a5b304e672ffc2e9910552ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9144b32c81f799492fe342580b23ef4ca0e9aee33498700000000",
+        "idx" : 0,
+        "inputKeys" : [ "a7b8ac52a75e454464f7d9853fe8eeaa94dfb1bb02c36ffe17389ab240ad1d32", "f15bc74057b06977cde192d68447782db9d62821c41dfe071843f1a1cb0c8a46" ],
+        "redeemScript" : "0020bae0247f65637377b4c2bc43220cfa5770aed8798cee99dd7c639c36c05d65ad",
+        "scriptWitness" : "01475221035770f2128f74b8e883d73973695829a85639bf230fb2b9dba7138eb65fb68197210219448db4441c769c8ab2617d57b1635141fa5599f5a7858c08a1428ff0b546b452ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914c56802dd47e68dc2e00ffbd477bb46d103c832bc8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "fbd64e8bbe0b91d0a167b2d05501d928c31371388597909ce3a2112f3aaff987", "3d7d04f0cf5da2a8a3e7e9eac73d23edfe1c16d257071236fd9e92cabc36ff55" ],
+        "redeemScript" : "00201c60761ec0cc6af8cb6af8b1931c2f24df947921932a8b64958600f0cd27b472",
+        "scriptWitness" : "0147522103474ec105c2b9ecbfc281613d05dbeeccf927ace7517165bcca89a9bae4ec3d472102977c7c19cad7941a273453e5c6647bd939a65814d09097257c4c9b95f9e4591952ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014bdeddc2821956fab73df1327e80febe6ce5da5aa00000000",
+        "idx" : 0,
+        "inputKeys" : [ "58d77b5cb70b464bb635707ab8fb541960a1a99c2841f45815fff10d91160577" ],
+        "scriptWitness" : "020021037649e8f5a6eeb4d1c1ef671d2ac5550d352cc8a31f736d0f45646dd19e626fb2",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qjxvgkfm2uxxlrf8gxe6m0nx3ym6v8yew6cxlev",
+      "fundingPrivKey" : "b1f00fd19e8802ba8f571333055527f25c5128af592947e4f84b2c1eaae106d7",
+      "payoutAddress" : "bcrt1qjg6vpdvdsyyl2p9aannpguwd9gtyc0ep75xmcd"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914937b46566d18f3581aeffce2a0c95b48a13c31eb8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "2ccf62d4c8969dfe26ef20a6095f6e6e8eadcbecab922ebc31dd1cd515987594", "551900f2c8cfc742061ec3aa54764060ad642ac76d4c84f956544a51b54062bb" ],
+        "redeemScript" : "0020df67b988a7b1657e816c2f8c8096d7c8bbe0c3c8fd4bf0906018bd62aeed2134",
+        "scriptWitness" : "01475221032c9f625a878ade4760f9f3c259b1e24a9a7e45a9c59ecaa5b26a21a8e214c6382102cf342a38f2d1d9fdb2f540f5157c62b0d47078a8b8e34fe4ebb1e023bcc7d66c52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qy673kax2p62mp79vuyezsy6jjhdxsqdwrf9npn",
+      "fundingPrivKey" : "169754ced2445f544d2947209dfb01534028fa309a8d9ad4cdbe13f18fdc71df",
+      "payoutAddress" : "bcrt1q2rhsqwqw4npyurzv0tx3vwg8f9mjts9pg8t4x4"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "02000000095cb66e9169c39e2062ecc2822783327dd13987d85437824bbe97581178b677d50000000000ffffffff8dcda6a2caae9f3d565e0d2f67070bc76edad0a0f791a6c946ae7f2a794f52690000000000ffffffffe88ffa3af10cf31423f371df3634a029892fd35860baf061fdd073a41ee29c410000000000ffffffffc4c66f9c64d9cf3e657aaa4398ca74e9df7f296b6c1ba135d09544e271636d3700000000232200208afaa056f90ad79e17cf6d9b971ec8da35118000d0d5a938f196c291d6055d9cffffffffff67e72a795a490b07ece41437fb4c50f2699bba1e3425985992a7f4360679b80000000000ffffffff22cc3d02c4d1e2229ef7c681c35e0c3ca1ec354e47a41f5a999ae693d732556b0000000023220020bae0247f65637377b4c2bc43220cfa5770aed8798cee99dd7c639c36c05d65adffffffff12f1f26f0753d994504e86bf29a9acf1f78d1d6c6f246dafca3cc65e5b2da8cf00000000232200201c60761ec0cc6af8cb6af8b1931c2f24df947921932a8b64958600f0cd27b472ffffffff1ac339b89830ee64399371a822d8bde7199c39da3600b725b0bae2c2b49395000000000000ffffffff2b2e2dfefb55242a5fa8a97af48021a69d05f2be816fb314709547de2f331b0d0000000023220020df67b988a7b1657e816c2f8c8096d7c8bbe0c3c8fd4bf0906018bd62aeed2134ffffffff0352c5eb0b00000000220020577a9d3317da1a28bb3660eea702089e2ceebd5a715ff72bda1c9a65b97067ebc81b68590000000016001491988b276ae18df1a4e83675b7ccd126f4c3932ea6dbf5050000000016001426bd1b74ca0e95b0f8ace13228135295da6801ae00000000",
+    "cets" : [ "02000000000101a18c7ea6bb30e6bbf5ddac0ebeee981ae6663dfc31e336834cd797d5904a59cb0000000000feffffff0100c2eb0b000000001600149234c0b58d8109f504bdece61471cd2a164c3f2101475221031fcdd02e227a128f35a5d8923374418c42996b41269c58570fe20f2388d3bda5210376d87c32d3692510f28ce2ab7c0f935c74a2838f1c22fed22e9eb8e5277f9fd052ae64000000", "02000000000101a18c7ea6bb30e6bbf5ddac0ebeee981ae6663dfc31e336834cd797d5904a59cb0000000000feffffff0100c2eb0b0000000016001450ef00380eacc24e0c4c7acd163907497725c0a101475221031fcdd02e227a128f35a5d8923374418c42996b41269c58570fe20f2388d3bda5210376d87c32d3692510f28ce2ab7c0f935c74a2838f1c22fed22e9eb8e5277f9fd052ae64000000", "02000000000101a18c7ea6bb30e6bbf5ddac0ebeee981ae6663dfc31e336834cd797d5904a59cb0000000000feffffff0233ac9300000000001600149234c0b58d8109f504bdece61471cd2a164c3f21cd15580b0000000016001450ef00380eacc24e0c4c7acd163907497725c0a101475221031fcdd02e227a128f35a5d8923374418c42996b41269c58570fe20f2388d3bda5210376d87c32d3692510f28ce2ab7c0f935c74a2838f1c22fed22e9eb8e5277f9fd052ae64000000" ],
+    "refundTx" : "02000000000101a18c7ea6bb30e6bbf5ddac0ebeee981ae6663dfc31e336834cd797d5904a59cb0000000000feffffff0200e1f505000000001600149234c0b58d8109f504bdece61471cd2a164c3f2100e1f5050000000016001450ef00380eacc24e0c4c7acd163907497725c0a101475221031fcdd02e227a128f35a5d8923374418c42996b41269c58570fe20f2388d3bda5210376d87c32d3692510f28ce2ab7c0f935c74a2838f1c22fed22e9eb8e5277f9fd052aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "e7b3f4829b513961fba9bf216ba107c64beead3343dfd0ce25d20a006d443d54",
+        "nonce" : "c1e1634b9a0697d8bd60c8e4874a483b45395c4b20d02eacea52702b3a8dd65b"
+      },
+      "contractInfo" : [ {
+        "preImage" : "3786215049925999740",
+        "outcome" : "bc3b08433a05340ea750d0cb7354206caa42a88d7da8b7a906021f173dce8f1f",
+        "localPayout" : 0
+      }, {
+        "preImage" : "8594279409804965449",
+        "outcome" : "803c5fcc8056aa5b09a3f0796de82f6c0ba9676dbfca6cd0120d00af5ff84a65",
+        "localPayout" : 40873766
+      }, {
+        "preImage" : "-8936502121529092243",
+        "outcome" : "816ebb97221c8f715177f4f7c9fce4c0da67b3d89d367832ee15ae7757cfd5c2",
+        "localPayout" : 200000000
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "803c5fcc8056aa5b09a3f0796de82f6c0ba9676dbfca6cd0120d00af5ff84a65",
+      "oracleSignature" : "c1e1634b9a0697d8bd60c8e4874a483b45395c4b20d02eacea52702b3a8dd65b68c69af39b618026e909d4073ee45a97c58db9eac8d61fe33d253ca3b5dc65a1"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9143c3709d63a827985fcaeb9cd8ef3d8324ab87b288700000000",
+        "idx" : 0,
+        "inputKeys" : [ "77d430faa7c3167d0c017970a92ecae66a9dcf4a68546564b6b2fd0feeb8fd0c", "728cd2df41b24830ecf3d2175bea4bc8e41df392774813d97518dc3ffbab9691" ],
+        "redeemScript" : "00206913da1d2286fe9e612287410be5bc0ab4540cac72186ea2d2a3c43952b89ec2",
+        "scriptWitness" : "0147522103004a46f28946c10d7ef3a0ff1f9f5062d8a2f4b4d0d6474907760088ee8d125d21024c801e74d99b8017923af9c0329055c57446e37b32399eee5fe1d4f8dee99ac652ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143d5dca1256300728b224e5013780aab21da1de6600000000",
+        "idx" : 0,
+        "inputKeys" : [ "c82c97f770aa20dd4d621761d32d4bc655ecd3b33564f0eeca7792cdff0d5039" ],
+        "scriptWitness" : "02002102d8a8a0ef4d104af0c5439a91fb0e16660a7ddfb3e7758140aed6e66853c45e81",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020578a49a7d2935d0cb430e271919b0210114f1538b72fc132d542281c2ed02f3800000000",
+        "idx" : 0,
+        "inputKeys" : [ "fb042da2a5afa4069d5ce52245966c83467e4cbb66ba22c7a1db8d89c99e8560", "7306517155c46f7f6e8b190a26d507d572c296b7d10309bbb71c9ca59cb55928" ],
+        "scriptWitness" : "014752210271c5e285dc865798be07604d580e9d46e2d427702f03e0d7bdaf8f5bad564f4d21022f6a280fca9d5d1b12c6b59873989e8d05c57e456de2759014623f650131f72352ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200206439b26394b3ae20df0a04e8be4aed52f1f17727769c540468ff770ed9e0949800000000",
+        "idx" : 0,
+        "inputKeys" : [ "ef656abf58925f2b351c073bdb387be505a42f412943042043a14faa69615a2d", "711d18d1837269ffaf8d114838d65aeced5baac528175e7b6814d40fc782510b" ],
+        "scriptWitness" : "0147522103899c6953942fd789fb7f67b542732953a2c3d0260cd72fa6f01d7ee7f0760333210369401c270c20bed70984d1ae0adb53dc1c1cd76d6eb0f6eef211bfb08cd76f6352ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020049f85cf78e95788183edeb7324b6982826ee69cf2b97e17b6a3f7463efcdf8400000000",
+        "idx" : 0,
+        "inputKeys" : [ "579e90ce0463093099c407ac8eff6ab6dbf16d73522b8a6d9347af759bf21798", "550758396eb6a6657a8e1f6ebb9935700ffc1f85a6b7e100ca344aed033d512d" ],
+        "scriptWitness" : "0147522103f3b9d187f9275ba4abc48eaab2d11a4b6a38a65d216e08fbe6b0aeefe678d9a92102160dda1b211761004cbb907e80940ba1cfc5e9ff13394b3361cd4c171ffe1e6b52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600146f9347bf74b1e24d077f117504bb0932bf03833500000000",
+        "idx" : 0,
+        "inputKeys" : [ "eb329d49fcf5d549c31b066670c66be787412969c3db1c5474b920b12c365a4f" ],
+        "scriptWitness" : "0200210301481723dce60e76f72db6fc2b06e020c27878e3c560da8cc168254569c3ce7e",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208735dd9ea777eeaf5a1b1700d3af242187f6b58d63b45faceec65d7df4168cde00000000",
+        "idx" : 0,
+        "inputKeys" : [ "f3efc285c7ec64f0d100c2408982f7e7d363fc3851e8140b61c5574fc19ceeda", "03072346861c9c294d061e6d58df399ec2ff71d09c2070e9b8c88a01e96e42a4" ],
+        "scriptWitness" : "01475221028b482f985b0bd28d03951ea80b107757e267dd5d51b343de8f85adc78a2f1f802102e16303871c55d805d9d1c35cf31b93d1be9d9e0b04687b974c635d004ea3bab152ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91426c67946be6552045545f636b952c3750161e7538700000000",
+        "idx" : 0,
+        "inputKeys" : [ "519abff8398a04e2512215114127c9a8d35fb9384ab5f0ed5a032d83b6b51fd6", "2d9eea7447bf6911f10c4a422b5626b1ac7c0cd8dd5cee7306045ab76a928b61" ],
+        "redeemScript" : "00209abbc8f87ab0837aa18a60340a7b3b54666fd518a7907a096d2cb753b20480a9",
+        "scriptWitness" : "0147522103dbc33b031cb1539b51ff81d7ee9da1640372a178cf6d5d6096bccdd2b2715cbe21026036831eb0bc65a0ebcf8f7faece76fea17a44165d62a4d1955d8cd33800927c52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qltrgkxw8ykvkuzfrumw7tjlh67wvwej4ldn7v8",
+      "fundingPrivKey" : "12a6fd79e2075bb809c404c6382eae4635022987227ab815a9b1b6365432a0fe",
+      "payoutAddress" : "bcrt1qwls8q5xm5ldh5ap4artwux75uzdcjp46xcanf7"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014d6feacea1f0196dae6de3e8f4246d9e56461a0b600000000",
+        "idx" : 0,
+        "inputKeys" : [ "560ed13df0fd9e05ba1b6ff045d1a6c55d313a40b35ca46b83f2f7c58df16afe" ],
+        "scriptWitness" : "020021036dbf66e84d2d3561243ca420431bb8be399c3788b00089af4744ca7e986c95df",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e7eb96be28cde0302fb2bf34135a46c19f0b8ea800000000",
+        "idx" : 0,
+        "inputKeys" : [ "82df6a92788575acb66ccf3b18df05464a32c596aa9174dc10d9529a85d11436" ],
+        "scriptWitness" : "02002103839b991d63a869bee27004af822f177926946ffa76840ee606b674aafbea8e90",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qgzfrw9k0asq4z0xczdhpwept2tjtxuw0gur5cg",
+      "fundingPrivKey" : "891065ec0db911f9b69001b2a0d49406272bb55edca43ac5b4c8a5b2492eec8c",
+      "payoutAddress" : "bcrt1qvdegfz8w52jrsnnrnh56pjqxzhl96h84wwpatn"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "020000000a5a9aa43b02c50e2522a761dd5a79d57d293f04b23e35b36bc036571b2377766700000000232200206913da1d2286fe9e612287410be5bc0ab4540cac72186ea2d2a3c43952b89ec2ffffffff4b9a4bd6896bca22af50d25229fcc3a139bfac47270403c7428759c27e84a78b0000000000ffffffffc834492e8d2db15f05cf120d7aa4877a673eee6316509d66666bbd406a01fb900000000000ffffffff2470261c37e9aa72bde3ed25b30c0faa228d69b55eb4c3793835558aa1f2b7b50000000000ffffffff8cf5997a69327881dbbc25e8a8c217821450d15e96d4bfc766e14f9d8551e7090000000000fffffffff1c1ae468143c8618ae2b80a7a6bce425b68ca28ea5d1aa27dd60d00ec777a5d0000000000ffffffffa40757577d5c820496654979d9774a00fa3644c51896f0818917ff3ee3e588770000000000ffffffff8f58a3c9fb52bba297ffe0555d5c33a558249ac9fcc03cb2ef1d51928842129e00000000232200209abbc8f87ab0837aa18a60340a7b3b54666fd518a7907a096d2cb753b20480a9ffffffff30ba3ec5b2781d44ca18af598b3bb9d811ef35b374b5973aebfde286423a51910000000000ffffffff8f13f86be6c01eba02dbc51ea86d620f9c92474239207a8c1a4a791e518d63750000000000ffffffff0352c5eb0b00000000220020dcf17d6d57e8af33853ea92211c570f880cc9d19e53d906b2b56e99140a6f491fe1c685900000000160014fac68b19c725996e0923e6dde5cbf7d79cc766558d9de1110000000016001440923716cfec01513cd8136e17642b52e4b371cf00000000",
+    "cets" : [ "0200000000010184a12c01e05a95655133f47821df30cbb1f7c678a59741a8cbaed35d464df9a20000000000feffffff0100c2eb0b0000000016001463728488eea2a4384e639de9a0c80615fe5d5cf501475221028fee90fa20f48705a3fe415c91f7213486e9c5cc0da79991ec7ae0596c1cd3662103aa6b75414e219ae44193802b71e2aeafc657e0980eedbfe0f88681835a616b0052ae64000000", "0200000000010184a12c01e05a95655133f47821df30cbb1f7c678a59741a8cbaed35d464df9a20000000000feffffff0226af6f020000000016001477e07050dba7db7a7435e8d6ee1bd4e09b8906bada127c090000000016001463728488eea2a4384e639de9a0c80615fe5d5cf501475221028fee90fa20f48705a3fe415c91f7213486e9c5cc0da79991ec7ae0596c1cd3662103aa6b75414e219ae44193802b71e2aeafc657e0980eedbfe0f88681835a616b0052ae64000000", "0200000000010184a12c01e05a95655133f47821df30cbb1f7c678a59741a8cbaed35d464df9a20000000000feffffff0100c2eb0b0000000016001477e07050dba7db7a7435e8d6ee1bd4e09b8906ba01475221028fee90fa20f48705a3fe415c91f7213486e9c5cc0da79991ec7ae0596c1cd3662103aa6b75414e219ae44193802b71e2aeafc657e0980eedbfe0f88681835a616b0052ae64000000" ],
+    "refundTx" : "0200000000010184a12c01e05a95655133f47821df30cbb1f7c678a59741a8cbaed35d464df9a20000000000feffffff0200e1f5050000000016001477e07050dba7db7a7435e8d6ee1bd4e09b8906ba00e1f5050000000016001463728488eea2a4384e639de9a0c80615fe5d5cf501475221028fee90fa20f48705a3fe415c91f7213486e9c5cc0da79991ec7ae0596c1cd3662103aa6b75414e219ae44193802b71e2aeafc657e0980eedbfe0f88681835a616b0052aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "f35f9b062b0c048608c62ba51ce83e6ac5f50d95d3c97ea1e3aacc95739f6390",
+        "nonce" : "8fe3878967f6ed874b568a5fd5b596e12af52bbffc5a2a993ab28a5ab54ef32f"
+      },
+      "contractInfo" : [ {
+        "preImage" : "-8611831950814159402",
+        "outcome" : "11700c0743762c73d3c18dfa063fec9710e989c56f934894d113cb2fac372afd",
+        "localPayout" : 170163182
+      }, {
+        "preImage" : "-3108780768253003905",
+        "outcome" : "7face0ed29680ae709b76292e451477858cba1a2f4480f0bc1862ebbc4740d20",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "1850873207173744127",
+        "outcome" : "630014c2be22e5bfd88a0e24b8e5ce1c743ef2c8b79c6589f4750d1631ded88d",
+        "localPayout" : 0
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "7face0ed29680ae709b76292e451477858cba1a2f4480f0bc1862ebbc4740d20",
+      "oracleSignature" : "8fe3878967f6ed874b568a5fd5b596e12af52bbffc5a2a993ab28a5ab54ef32fb8712f1a707c8cc89a4fabf527122beb726ff9befeb5ee25230dd5609a1922f9"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209839fed2dfe8b90be4f5d053436f7e1233449f2004dcae9a29f44cd63567f59a00000000",
+        "idx" : 0,
+        "inputKeys" : [ "f3c3ed0bb50cb8294c94bcebba565eaf88f71b93fe76367bff2cd05ae389e2a5", "a7a24ce2b0eb7251a39506bfa008ce115904599b2d0fc081349b76a662d387d3" ],
+        "scriptWitness" : "01475221032ac200d22cf87a35cf583e62db5ab6f0e7942b371c79f556346e009df7a353492103da934267e072c1a4a766f54a1b43bac0f40fa03fca2aceb094749269b585758f52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014bd41d65f6627c6adb2ea44432605a0e808eb78ba00000000",
+        "idx" : 0,
+        "inputKeys" : [ "7acbefd6192ad68cfce7a844e7abacf601a00535ef6c7241e8df179a534bcf29" ],
+        "scriptWitness" : "02002103faac71ab8eeca8ab7a4323d58c3ddf8be70d8f24b796ab37f86c10ab91434568",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914705484515b6669f6a26cd87fdf1aade8e98f47068700000000",
+        "idx" : 0,
+        "inputKeys" : [ "aff92d2f3a3e2cf2dd355bce812e8038495bcf025576a8e22d99b10d9acd2cac", "cab833c2d89c5bdc7d80e9578b4fcf6e14e447c107e7a302c4c5c2a219558ec7" ],
+        "redeemScript" : "0020a4616f5b8c508f888f2856d5112f0cf034194c0e47859f3c0872efe1ff3e429c",
+        "scriptWitness" : "0147522102b5128765d59f50a73511447da56af2b3cf94d23ed205dc85cac813374767561821039bdd854d542a25532687d0927cbee8cd4c8993eb054a2f3ea631a20402229d5052ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914c859b8dceee3038907f75a940b07ea6baf2e112f8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "8fd590934c67df39b68cc6784fb03476276470772fdbe82b53e6f743cb9c0e08", "aedfe075fec9433fa09a93de946e68865709ce563ee6a96fdfd9f8d3035c620c" ],
+        "redeemScript" : "002037de01a75e02c53447198ebf7229a25dcaed62bc007d73933362036b932e8b30",
+        "scriptWitness" : "014752210315b3b6f66e3863b3000ddd53b1f581f9af100ec4bea3ac428c253387a937a3f82103a646d432aede619791c80a36adc7e5ae4842325f56af74a1f3a5e81356c3176e52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002069e318e098337d7e5389346f02f86fde99ffad0d491fa8bb490ba8db3fc4ff1000000000",
+        "idx" : 0,
+        "inputKeys" : [ "6d143d6f9c788f24535fe0d6768f9dd2a1bb779d2db5f984fcc27536159829b5", "305f42681ed6f8277762ed5e19a37e3b88b40ce2406dd301c754573ac61cc144" ],
+        "scriptWitness" : "0147522102c934221dd13ce88b6d060a5c4fac801273c762985e4fefdcf536d8f293ef3a2a2103901d6c3cb6c1882e863499f5bac8b0597bf386e7ba179ce657e79cc47c43877352ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001406308f96d0c1629474a29ad0c67707899f7f520500000000",
+        "idx" : 0,
+        "inputKeys" : [ "946e1d1469f4f036cc20bb9653e0c739b31a6e06d08a6b4c7eff62d1ea3ec808" ],
+        "scriptWitness" : "0200210205b34481e04f725ffb4da5c4492f831480b1eccf6a90ee399f8c2cbacddbf8eb",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91474c3eabf189e80eb244579457518c9455e15f8618700000000",
+        "idx" : 0,
+        "inputKeys" : [ "077d11b15e6bb6d431969902116b0b16dd507f09a8e813e303769d35663581ac", "ba2c033eafd9f8017182236b4199aed89e565d4a9771a5a48038dac82217cff7" ],
+        "redeemScript" : "00203a806939ee507738a9d918fc6810b07c6b8f2b03b508ec6c62064b39ec3424c8",
+        "scriptWitness" : "014752210348a211cca8c3e776f866471d313084d494fa8ce8f93674f193d9d5303bb419b42102ba13a4d8fea25e3ae204756eec88849c0523fd21a7e7cc5004e6135825c0655b52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9142e32970b6a784dcb1ab042a322da3ca5ebab722e8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "5129529265ea9a3cbf19031daeaa9c6d82096fadbac0d806f1533a9ac9257944", "ddb46b010b69961d96525a530b3fed51e6e6f3658f9042a34de30d552b876871" ],
+        "redeemScript" : "0020edb47c30fd229d969d2c637aa23bc15ab290365fad32554167c92b707ef8f323",
+        "scriptWitness" : "01475221038c52e80d2516393edfb3a886868b0b34744c96e69579586b0d581b940ba08dbf21038eaf456adcad8de681c77fd321f7dc1eda04fc36b90aa2973981a8ac98832ab052ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1qqudqaggftn4k8nc4yexujdfeqg0jkjlrevzj3k",
+      "fundingPrivKey" : "c9d2f93cafc58666111c44983040fd43f38450dcc35c0cadc6f43d735db311f6",
+      "payoutAddress" : "bcrt1qhp9jx3c6wg5xvjjehp9leftgjx00uj2et7q246"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001471fcae3b160d6ccbccdc94981b89254f36114b9500000000",
+        "idx" : 0,
+        "inputKeys" : [ "2116ec6896fb274522fb74c3caa163c41b254312aa2b45e4a6d5668db0ecb86a" ],
+        "scriptWitness" : "020021034b51e93ec4997e800e5a03e9b24f8a532fcdc4f69443da770479d8718811a9b1",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9146c69103862ebbcb88344520da7515528db5932378700000000",
+        "idx" : 0,
+        "inputKeys" : [ "242a70aad560e6077ef76e1acccad06cd71275de2d6c1774334655adf38018dd", "0b8c71608035539a49eda34a799981bebad495f71e0404f9695c1ae0ccf74a32" ],
+        "redeemScript" : "0020f666c89666e0f81dddb01b6a4293d3f1051e6911e1167a27203aa98ae0cd1b11",
+        "scriptWitness" : "0147522102d78cf329c8b3a3160d887c3ed31756aa294d7edb480df015a685cf35789e3dc92103abfac1bcd414b3440fa1219cf0f4204946f88d5e19d917fae74112ce899d6c9252ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014d2d604e693c50fab67f711a5fd407acb9cac83e000000000",
+        "idx" : 0,
+        "inputKeys" : [ "cf6254b974ba88fb574662c480af1dfc1770ef4055f3858a6ec117c42e69c582" ],
+        "scriptWitness" : "02002102cac3bbf5c85c08e549bfd86c44ccdb86fd1e6e78f20fbc7623ebc58abf061a06",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qy39p9ekdk2ws2sk32vh6ctrdnm7kr9r2c790un",
+      "fundingPrivKey" : "88486a59ac12b5995209d3bb8289a1015c64d0352b2a22fc96d3d6115b5fb1af",
+      "payoutAddress" : "bcrt1qaruxtlydae3s9zduhm09246vsggk7cylyfav3c"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "020000000b5b2ca56029364ebc71d9eb4dd751464e86d4a2e58c2d7cb5538b9e85204de9540000000000ffffffffae068581ecf3d801034fe64d3a34e0a66bd8c418f3a6793353d7c1f1216e28900000000000fffffffffa38b4d25de598040e95b9748c39bcac16dba7e46658a569c52236bcb91505a60000000023220020a4616f5b8c508f888f2856d5112f0cf034194c0e47859f3c0872efe1ff3e429cffffffff279fa160e02d63fbfdaaeeeb80f59f964f999eedfcce3fc5548f7a89b918c95e000000002322002037de01a75e02c53447198ebf7229a25dcaed62bc007d73933362036b932e8b30ffffffffdbfb6c0977d6ed42de83932f83c4a41bf28c38949b7c75294299f35a00eeaede0000000000ffffffff42dcc47f46b6d2323a9594a328e0c6ecee1bbbd1d8295e716f5cd06a74e17a8a0000000000ffffffff0b4c1e8026b34af94aa6f63d8b66b96f3669de4a2df1f2a487498cc6966da0ce00000000232200203a806939ee507738a9d918fc6810b07c6b8f2b03b508ec6c62064b39ec3424c8ffffffff333e6e9b11bfe8f90bd18448ace312d49eb72f213d29b8800d553f1b810dbcb30000000023220020edb47c30fd229d969d2c637aa23bc15ab290365fad32554167c92b707ef8f323ffffffffd9d16098edae428373ece726496f54e20084b880497c0f0b3ee8d55d3d73d36d0000000000ffffffff5e8c20924b532521ce1a3b6fc93210099ece4654b39cca0f47374b7c1a9dc9000000000023220020f666c89666e0f81dddb01b6a4293d3f1051e6911e1167a27203aa98ae0cd1b11fffffffff10c99526ba5067a0105d61c15297dccf8269a48ff7487a3f08b7ca86803b3060000000000ffffffff0352c5eb0b000000002200208ef43f8280d18a877a7b003b2960ca67e3d4cf98e279c5f421c119fc65ccd83ba01b685900000000160014071a0ea1095ceb63cf15264dc93539021f2b4be3035dcd1d00000000160014244a12e6cdb29d0542d1532fac2c6d9efd61946a00000000",
+    "cets" : [ "020000000001013761b55aafcdeed976d1e9c45ed032e2f07473aa88eb8519a44acd84d3183a300000000000feffffff02ee7b240a00000000160014b84b23471a7228664a59b84bfca568919efe49591246c70100000000160014e8f865fc8dee630289bcbede55574c82116f609f014752210306ac10d29a8aced395b667dd52d262771085bcfab6c48fcea20fd03f970d225c21038bf9aae8a8a89e97018d942e9fea75be101c04f9186a12e0971d1483cadc9cde52ae64000000", "020000000001013761b55aafcdeed976d1e9c45ed032e2f07473aa88eb8519a44acd84d3183a300000000000feffffff0100c2eb0b00000000160014b84b23471a7228664a59b84bfca568919efe4959014752210306ac10d29a8aced395b667dd52d262771085bcfab6c48fcea20fd03f970d225c21038bf9aae8a8a89e97018d942e9fea75be101c04f9186a12e0971d1483cadc9cde52ae64000000", "020000000001013761b55aafcdeed976d1e9c45ed032e2f07473aa88eb8519a44acd84d3183a300000000000feffffff0100c2eb0b00000000160014e8f865fc8dee630289bcbede55574c82116f609f014752210306ac10d29a8aced395b667dd52d262771085bcfab6c48fcea20fd03f970d225c21038bf9aae8a8a89e97018d942e9fea75be101c04f9186a12e0971d1483cadc9cde52ae64000000" ],
+    "refundTx" : "020000000001013761b55aafcdeed976d1e9c45ed032e2f07473aa88eb8519a44acd84d3183a300000000000feffffff0200e1f50500000000160014b84b23471a7228664a59b84bfca568919efe495900e1f50500000000160014e8f865fc8dee630289bcbede55574c82116f609f014752210306ac10d29a8aced395b667dd52d262771085bcfab6c48fcea20fd03f970d225c21038bf9aae8a8a89e97018d942e9fea75be101c04f9186a12e0971d1483cadc9cde52aec8000000"
+  }
+}, {
+  "inputs" : {
+    "params" : {
+      "oracleInfo" : {
+        "publicKey" : "79cbc967d80f635e70082ebd151701f47368bef826f6764dcbb6e701eb79688a",
+        "nonce" : "28e56a6a8e52efd6c364b49344c1f079dac6e66066e2d910e4e0c807b02af9e8"
+      },
+      "contractInfo" : [ {
+        "preImage" : "180283582877937499",
+        "outcome" : "9344aab2b4b017e3518645f7687636b84dabc81516f16dbc36866fd09d024a79",
+        "localPayout" : 200000000
+      }, {
+        "preImage" : "-7011066972155496222",
+        "outcome" : "7eb4a63c9e2d86b7369656876368a76066f8a9c25a161e2a8c34519c53d40c16",
+        "localPayout" : 0
+      }, {
+        "preImage" : "2863382793087547155",
+        "outcome" : "f34529ef2afe86b4a867eb52dbd7d2baa0d6a636806edc1f33f5871dcc8cd2af",
+        "localPayout" : 183121304
+      } ],
+      "contractMaturityBound" : 100,
+      "contractTimeout" : 200,
+      "feeRate" : 5,
+      "realOutcome" : "7eb4a63c9e2d86b7369656876368a76066f8a9c25a161e2a8c34519c53d40c16",
+      "oracleSignature" : "28e56a6a8e52efd6c364b49344c1f079dac6e66066e2d910e4e0c807b02af9e8238b03cac5fd91e597d814b9d4a2ba1a265a94fe029cb777f70bb70bee0b4b3a"
+    },
+    "offerParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143dbabe325c673a2085149463e61502433bdd587700000000",
+        "idx" : 0,
+        "inputKeys" : [ "e3e77795ff20a02060e1a10e31d47e366d1dfe1110e0bb76489f2afdd3e32f98" ],
+        "scriptWitness" : "02002102776bf66fb6dcd08f2351c54041c9766d5ab78d07372b64ba0a6679c9ba4df33d",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ae612e835d504c52c2316a041c9e4edfced90c0500000000",
+        "idx" : 0,
+        "inputKeys" : [ "7b5fd93de358810e265cd8d2da494ac07fa4a61807a93f8dcc948e3f541c2c22" ],
+        "scriptWitness" : "0200210300278957a0b78d7025c018ec6e79fbbf7a5737c2bb3fc6455cd929445bc72d13",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9141fb7f6ffcd46db586b3bc802b49725a47fa8825f8700000000",
+        "idx" : 0,
+        "inputKeys" : [ "067f0aee1437cef4af15d8dfe78e459acd353dd1f790aab9dceec5cf2862514d", "5f662cebf8aeebb3fbb61f07e3895931d82720b645242f0b85c2e677badb1f4a" ],
+        "redeemScript" : "0020500920ce687635f6a5b9885187b5005361f93bf91aa19d251bc8f2c5c12fb18d",
+        "scriptWitness" : "01475221037bc36e915610d9f7b2e127e8233ca2da5380846fe60e2dd899ff62d59f313a7621036461f8bd8d3eba7c1c9bde364e5befadd1d4238c5a4c4038f4c34368a8c11d0252ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914b5cbe948d66732d9836eb5ba14f22e18929bf8668700000000",
+        "idx" : 0,
+        "inputKeys" : [ "154d97656b67d591ade9a821c50799970cb1fb7f1ec2a1cd09251ca718f06e72", "7fde026542f3b75c239ea436cd8019e5e885ef78f666d91ba249e7d5e356e0a4" ],
+        "redeemScript" : "00201d45f51c03707ef348b6737fceab2ab6af2ab63af9acc95f150eb6c6b304a4f1",
+        "scriptWitness" : "0147522102ed48b56f412ff53a4e008fd5133299d93ad89e0de22cefa31cd1502c2a7194ce2102b916e37339d4d2e772d4ad0d2d24269add32c7f716a69be0dd9fd515aeb0bfb352ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600141f1ae5802cbdb972a2a39af5be37e0532e8b0d0900000000",
+        "idx" : 0,
+        "inputKeys" : [ "458a06fad590e6cf57e843a97084e4b5ac4ed464997d2e0760ca88fcab5e450f" ],
+        "scriptWitness" : "0200210207ed47bb4233f6d0b761d3d4abc6af7d3b42203bf8491632fecd71dcea6056b5",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014414e77318c96407650257e25013c733bfd28ebca00000000",
+        "idx" : 0,
+        "inputKeys" : [ "2c4d001aac58a2f477d8c6ca50d742658b4e85cd025dd3d8e3638068c89a9446" ],
+        "scriptWitness" : "02002103368db32128087cb6b09d03c955c01b6857c702cda23b334d2c9db380327031fe",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208ffcbccc30951c00ea7cabe04183a3665b55ee90504d270cc4d477bd9782ddd900000000",
+        "idx" : 0,
+        "inputKeys" : [ "f1d7799dc06af2bcb5031c51c8a02b236aa69dca36ccc9d34543e55bf4c5510e", "99e2f02d613ba538338d51b83000ab461dbdcefd877d6e529d9d5b92bdf8727f" ],
+        "scriptWitness" : "014752210217c1c184e59cfaebeda1ea01f11b8055e70af2eb9bd79e0e2e2520aa463133912103ef0cc74ba368c69031c7b68ec5e444274ea56e05db355ea96cddf969ecb429ec52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914db5252476be0cb41e32861b387cf51a7413d7dd58700000000",
+        "idx" : 0,
+        "inputKeys" : [ "8c000356f73881012355e0e0449add9a7aec9b94b1b6527df404b4d005ad3d3b", "32bac6329a54eb0c7429a3ed2d68cbd61a526ae068db973f992fba91cd466088" ],
+        "redeemScript" : "0020c5517f5df6c37879445f3b180addca82a6c3f1aa5d9566eef7ede3cb19c85420",
+        "scriptWitness" : "01475221036b8abc502660b3222f8186957fdf94b3c5abce37140127091a010f2bdf69fbef21023bbc56df3e48461a7a8b3bfb9b5e442e35279d3b54e02d5cefe4c22362617feb52ae",
+        "maxWitnessLen" : 218
+      } ],
+      "changeAddress" : "bcrt1q5zy45nne9kmeteqwlfwpnkcqcpdtpun8s45g0h",
+      "fundingPrivKey" : "6d9973c7c74d7d529e3a15d1f3650a55a72d7b02e90a9c07f02db2851cac847b",
+      "payoutAddress" : "bcrt1q9w9fdyj6nnldy54hdmmj0smsc4n4j87hf9l9xq"
+    },
+    "acceptParams" : {
+      "collateral" : 100000000,
+      "fundingInputTxs" : [ {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143bfef687635ab43fa90cafe67265a9e51fdb3eec00000000",
+        "idx" : 0,
+        "inputKeys" : [ "cad18ea35d1566cb70f0f9621aa38ef4f3e0c1138cebd2249cd4d94a22f6953b" ],
+        "scriptWitness" : "02002103ef268468b6dd2680eb318c9f96c90cced49c678f16dcd71814ad1f9f921da1b4",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600149591f237a03a6f6c431d6b7c44fffa0e7038742f00000000",
+        "idx" : 0,
+        "inputKeys" : [ "90907c2914b69bd893273347cae503dcbbc206354fd9435ac613648676986d39" ],
+        "scriptWitness" : "02002102ba26eddbd81cf9887bf5a507b66e8e1cee21f67b86de0f9f4aa83449aed49793",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020c6744ac4a48d1ea11dcc4ddd6e94546561c7ab792ee6a7764c39bf148e1d816d00000000",
+        "idx" : 0,
+        "inputKeys" : [ "4f39e67dd8bbc64761d3869ae4446ce612959df55aaf1ed3a55e291313358dff", "3711c789d4e73a132c5698a5447f0e9848a616919cc7f4bba6a762b1aa0cec2a" ],
+        "scriptWitness" : "0147522102edf5b76d494ed16be3f626167a0a9d7d08cb96cd6a55b711c4efb39b765866b92102619542ac7ac67fc1ab96303ee6a32ac3227fa0513a543d8ec25e612ae704edd152ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001427270e9b97e372a398fe2d400a65552d3f80574100000000",
+        "idx" : 0,
+        "inputKeys" : [ "b8a05a715c4da7f3aa46b67b65d364bec08af1c9d91a7d74f9b3b9a7187da52f" ],
+        "scriptWitness" : "0200210298f161d64d82b9cb98243c7d16f66c6b645aada5922bc1937c4d0249a5186008",
+        "maxWitnessLen" : 107
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200203028f773013459e4cdef9d1e601aedc40349267275d98af1f558bebbc727128a00000000",
+        "idx" : 0,
+        "inputKeys" : [ "4af7edaf7c0fa9e38452070d62d7a4a15c1c5cc6597cf122636ea04b4bc91f21", "3b113182d45d87f58e7caa70b80c96126c5161ae6dce5392a0a8bf48a47c3d79" ],
+        "scriptWitness" : "0147522102693351c1b963b31b3cb152726312a3ded1ebe4980a9398323b685dd3c6313750210308386798355f526c7685044a96a0db4fa7a3400e2c17b972b36f17a583dd410452ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ff04f96a38a0658fb8b6daac94f82dfbf410908b6d3a374f27f8dc1c656d271700000000",
+        "idx" : 0,
+        "inputKeys" : [ "ea3d5128ed90bbbc3971e45905e5385da219445d706402f9807d48bb5024cc27", "9c258532bfb479ea7dc0bb6eefbe208d3ac251b9dcf1279724ba158ac6e1a376" ],
+        "scriptWitness" : "0147522102ce3a560664dcea78d24dfc45da03da97e9d442e7f824a9bc074c41766b84f0112102f43975e777017255ba6c991623fa774f382e0c3936e816815fc06075b8766a3b52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020781e81c396a24203890e72de4e5c36066ed9e723b0f5ecdcc73f50ef46b2e3dc00000000",
+        "idx" : 0,
+        "inputKeys" : [ "64e807670fa0d755eef33559380668ca8aae74c72ed8930b59dd2cdf9812bef0", "7eb52d85cbbe30926b49ca42e622fc9223917398f16f243bcf0ccc14bc54e5de" ],
+        "scriptWitness" : "01475221039dcff5549f9f0d081423726ec7301b3d30fbde3477e96b72ae8a8dcf4449205b2103a5ba7c3b869fa6106c5310de67e0a3c99a3dc66beb33f76baf29f4b6017944cd52ae",
+        "maxWitnessLen" : 218
+      }, {
+        "tx" : "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001421d3dc7fc6ed3f971c07098e757d56e84bea724900000000",
+        "idx" : 0,
+        "inputKeys" : [ "6416f79c44f88fdb3747d63a872d7e52368079142cf2b10e84c04c68ebc8ba68" ],
+        "scriptWitness" : "020021032797a6cae53b592d5e9803aebafe3496ba7e146e4a5768946666218749e23f06",
+        "maxWitnessLen" : 107
+      } ],
+      "changeAddress" : "bcrt1qpszdvz3n760erqs9qnyw7ja8ff745psjg3r79x",
+      "fundingPrivKey" : "548b675aba9c9e657830a8235f1fc42803cee34e65c623c3247c0ef5cbc6987d",
+      "payoutAddress" : "bcrt1qvhszskh4zuyq2gmfz264as9fag0tn039qudvc0"
+    }
+  },
+  "txs" : {
+    "fundingTx" : "0200000010caa1c1353a70799e9468f13be0eeb331a8b867fbcd18ede18d52a2818adc971d0000000000ffffffff3f35a1dc6d4edc6ba01a89cb04d17b05225d76efd4aaf41ecb1203c4a39bb7dc0000000000ffffffffb2458b0088486a52bcde04c5c9d392ffb5e6ad395c90399731877475347540ec0000000023220020500920ce687635f6a5b9885187b5005361f93bf91aa19d251bc8f2c5c12fb18dffffffff5abee939130eec2c9377386fd7db6bc89a3c127e8fbecdd958a990a5c1621e8000000000232200201d45f51c03707ef348b6737fceab2ab6af2ab63af9acc95f150eb6c6b304a4f1ffffffff0eafe3974b1671e1cdfbdaeaeee657c2e214e6c88d8d87dc79c84d5bbec4f5910000000000ffffffff467b7b106f64970a1bdb134a679b251cad36d7fca1354147dfb3e2306e9cfd0d0000000000ffffffff8d3c39384bae97064b58ea11a98b12b3b2c6be02a4f2bd00e4a7532b2dbc96940000000000ffffffff858b2c036f52bf978ea6dc328d65fd5d25ddf900965d49d291a988c82db1b0520000000023220020c5517f5df6c37879445f3b180addca82a6c3f1aa5d9566eef7ede3cb19c85420ffffffffb65f4c6d41aa23bda098cf08a18358b7470cc9ff9db661c3c2c4502b3fad3da10000000000ffffffff699972f1a48331a4fa255fcfcfad0687b21e49263d3db6a1ad0923be878041060000000000ffffffff13b5acb23a97fd8daaca9dcfb000aec6c24d18175f5b2d28bae285267ca8b16d0000000000ffffffffe76f99a273370e3851865e2e3426d1b49707ff638a2b62c93ae6843c98156e790000000000ffffffff82dd88082a337cc5371adfe68aaae4923d49f64b7abb964da5268154921f725e0000000000ffffffff0887bb0796acb54774825d6a67e2c67e70892852a2e9a9a897fbccdeb4ede5530000000000ffffffffa3ccb42bc38cdd8a2c148c5388b2a2c6d94d4c942dece61e60876c9b7ec30e7b0000000000ffffffffedddc17c692d6f225d73b88dc1b55ec4a349991c65fd670da05f5b5879946f690000000000ffffffff0352c5eb0b000000002200201cbce2656fbc781147a965e0f83bc5787c761a218cd28866635a547c9164354e671d685900000000160014a0895a4e792db795e40efa5c19db00c05ab0f267741f6859000000001600140c04d60a33f69f91820504c8ef4ba74a7d5a061200000000",
+    "cets" : [ "0200000000010140d3270b468c9780988b9b35483483eb98bc1bf0e5c21c2ffd5b09d41780050b0000000000feffffff0100c2eb0b000000001600142b8a96925a9cfed252b76ef727c370c567591fd701475221022fc4d2d0729b24311641c430b84268e4884b9fe8e7bdb0c937df8c92cbf20eb62103df09ad6ab6e2140a5355f04c89434e828a478cb075f23cdb45cb3176410f5b0852ae64000000", "0200000000010140d3270b468c9780988b9b35483483eb98bc1bf0e5c21c2ffd5b09d41780050b0000000000feffffff0100c2eb0b0000000016001465e0285af5170805236912b55ec0a9ea1eb9be2501475221022fc4d2d0729b24311641c430b84268e4884b9fe8e7bdb0c937df8c92cbf20eb62103df09ad6ab6e2140a5355f04c89434e828a478cb075f23cdb45cb3176410f5b0852ae64000000", "0200000000010140d3270b468c9780988b9b35483483eb98bc1bf0e5c21c2ffd5b09d41780050b0000000000feffffff029835ea0a000000001600142b8a96925a9cfed252b76ef727c370c567591fd7688c01010000000016001465e0285af5170805236912b55ec0a9ea1eb9be2501475221022fc4d2d0729b24311641c430b84268e4884b9fe8e7bdb0c937df8c92cbf20eb62103df09ad6ab6e2140a5355f04c89434e828a478cb075f23cdb45cb3176410f5b0852ae64000000" ],
+    "refundTx" : "0200000000010140d3270b468c9780988b9b35483483eb98bc1bf0e5c21c2ffd5b09d41780050b0000000000feffffff0200e1f505000000001600142b8a96925a9cfed252b76ef727c370c567591fd700e1f5050000000016001465e0285af5170805236912b55ec0a9ea1eb9be2501475221022fc4d2d0729b24311641c430b84268e4884b9fe8e7bdb0c937df8c92cbf20eb62103df09ad6ab6e2140a5355f04c89434e828a478cb075f23cdb45cb3176410f5b0852aec8000000"
+  }
+} ]
\ No newline at end of file
diff --git a/dlc/src/main/scala/org/bitcoins/dlc/verify/DLCSignatureVerifier.scala b/dlc/src/main/scala/org/bitcoins/dlc/verify/DLCSignatureVerifier.scala
new file mode 100644
index 0000000000..1709c4029c
--- /dev/null
+++ b/dlc/src/main/scala/org/bitcoins/dlc/verify/DLCSignatureVerifier.scala
@@ -0,0 +1,135 @@
+package org.bitcoins.dlc.verify
+
+import org.bitcoins.commons.jsonmodels.dlc.FundingSignatures
+import org.bitcoins.core.crypto.{
+  TransactionSignatureChecker,
+  TransactionSignatureSerializer,
+  WitnessTxSigComponentRaw
+}
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.policy.Policy
+import org.bitcoins.core.protocol.tlv.DLCOutcomeType
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.core.psbt.PSBT
+import org.bitcoins.core.script.crypto.HashType
+import org.bitcoins.core.util.{BitcoinSLogger, FutureUtil}
+import org.bitcoins.crypto.ECAdaptorSignature
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import scodec.bits.ByteVector
+
+import scala.concurrent.{Await, ExecutionContext, Future}
+import scala.concurrent.duration.DurationInt
+import scala.util.{Failure, Success}
+
+/** Responsible for verifying all DLC signatures */
+case class DLCSignatureVerifier(builder: DLCTxBuilder, isInitiator: Boolean)
+    extends BitcoinSLogger {
+  private lazy val fundingTx = Await.result(builder.buildFundingTx, 5.seconds)
+
+  def verifyRemoteFundingSigs(remoteSigs: FundingSignatures): Boolean = {
+    val (remoteTweak, remoteFundingInputs) = if (isInitiator) {
+      (builder.offerFundingInputs.length, builder.acceptFundingInputs)
+    } else {
+      (0, builder.offerFundingInputs)
+    }
+
+    val psbt = PSBT.fromUnsignedTxWithP2SHScript(fundingTx)
+
+    remoteSigs.zipWithIndex
+      .foldLeft(true) {
+        case (ret, ((outPoint, witness), index)) =>
+          val idx = index + remoteTweak
+          if (ret) {
+            if (psbt.transaction.inputs(idx).previousOutput != outPoint) {
+              logger.error("Adding signature for incorrect input")
+
+              false
+            } else {
+              val fundingInput = remoteFundingInputs(index)
+
+              psbt
+                .addUTXOToInput(fundingInput.prevTx, idx)
+                .addFinalizedScriptWitnessToInput(fundingInput.scriptSignature,
+                                                  witness,
+                                                  idx)
+                .finalizeInput(idx) match {
+                case Success(finalized) =>
+                  finalized.verifyFinalizedInput(idx)
+                case Failure(_) =>
+                  false
+              }
+            }
+          } else false
+      }
+  }
+
+  /** Verifies remote's CET signature for a given outcome hash */
+  def verifyCETSig(
+      outcome: DLCOutcomeType,
+      sig: ECAdaptorSignature): Boolean = {
+    val remoteFundingPubKey = if (isInitiator) {
+      builder.acceptFundingKey
+    } else {
+      builder.offerFundingKey
+    }
+
+    val adaptorPoint = builder.oracleAndContractInfo.sigPointForOutcome(outcome)
+
+    val cet = Await.result(builder.buildCET(outcome), 5.seconds)
+
+    val sigComponent = WitnessTxSigComponentRaw(transaction = cet,
+                                                inputIndex = UInt32.zero,
+                                                output = fundingTx.outputs.head,
+                                                flags = Policy.standardFlags)
+
+    val hashType = HashType(
+      ByteVector(0.toByte, 0.toByte, 0.toByte, HashType.sigHashAll.byte))
+    val hash =
+      TransactionSignatureSerializer.hashForSignature(sigComponent, hashType)
+
+    remoteFundingPubKey.adaptorVerify(hash.bytes, adaptorPoint, sig)
+  }
+
+  def verifyCETSigs(sigs: Vector[(DLCOutcomeType, ECAdaptorSignature)])(implicit
+      ec: ExecutionContext): Future[Boolean] = {
+    val correctNumberOfSigs =
+      sigs.size >= builder.oracleAndContractInfo.allOutcomes.length
+
+    def runVerify(
+        outcomeSigs: Vector[(DLCOutcomeType, ECAdaptorSignature)]): Future[
+      Boolean] = {
+      Future {
+        outcomeSigs.foldLeft(true) {
+          case (ret, (outcome, sig)) =>
+            ret && verifyCETSig(outcome, sig)
+        }
+      }
+    }
+
+    if (correctNumberOfSigs) {
+      FutureUtil
+        .batchAndParallelExecute(sigs, runVerify, 25)
+        .map(_.forall(res => res))
+    } else Future.successful(false)
+  }
+
+  /** Verifies remote's refund signature */
+  def verifyRefundSig(sig: PartialSignature): Boolean = {
+    val refundTx = Await.result(builder.buildRefundTx, 5.seconds)
+
+    val sigComponent = WitnessTxSigComponentRaw(transaction = refundTx,
+                                                inputIndex = UInt32.zero,
+                                                output = fundingTx.outputs.head,
+                                                flags = Policy.standardFlags)
+
+    TransactionSignatureChecker
+      .checkSignature(
+        sigComponent,
+        sigComponent.output.scriptPubKey.asm.toVector,
+        sig.pubKey,
+        sig.signature,
+        Policy.standardFlags
+      )
+      .isValid
+  }
+}
diff --git a/inThisBuild.sbt b/inThisBuild.sbt
index 4b2f8bf5c4..09ae73dcb7 100644
--- a/inThisBuild.sbt
+++ b/inThisBuild.sbt
@@ -4,7 +4,7 @@ import scala.util.Properties
 
 version in ThisBuild ~= { version =>
   val withoutSuffix = version.dropRight(8)
-  withoutSuffix + "SCHNORR-DLC-SNAPSHOT"
+  withoutSuffix + "ADAPTOR-ECDSA-DLC-SNAPSHOT"
 }
 
 val scala2_12 = "2.12.12"
diff --git a/key-manager/src/main/scala/org/bitcoins/keymanager/bip39/BIP39KeyManager.scala b/key-manager/src/main/scala/org/bitcoins/keymanager/bip39/BIP39KeyManager.scala
index cb2cbc71cc..84d6fd3271 100644
--- a/key-manager/src/main/scala/org/bitcoins/keymanager/bip39/BIP39KeyManager.scala
+++ b/key-manager/src/main/scala/org/bitcoins/keymanager/bip39/BIP39KeyManager.scala
@@ -56,7 +56,10 @@ case class BIP39KeyManager(
   private val privVersion: ExtKeyPrivVersion =
     HDUtil.getXprivVersion(kmParams.purpose, kmParams.network)
 
-  private val rootExtPrivKey = seed.toExtPrivateKey(privVersion)
+  /** FIXME Temporary public, should be private, This is still required to make the
+    * BinaryOutcomeDLCClient from the wallet, can change back to private val when we change the client to use a Sign instead
+    */
+  val rootExtPrivKey: ExtPrivateKey = seed.toExtPrivateKey(privVersion)
 
   /** Converts a non-sensitive DB representation of a UTXO into
     * a signable (and sensitive) real-world UTXO
diff --git a/project/Deps.scala b/project/Deps.scala
index 449de4e322..eff8d46477 100644
--- a/project/Deps.scala
+++ b/project/Deps.scala
@@ -244,6 +244,14 @@ object Deps {
     Compile.scodec
   )
 
+  // version number needed for MicroJson
+  val dlc = List(
+    Compile.playJson,
+    Compile.newMicroJson
+  )
+
+  val dlcTest = List()
+
   val secp256k1jni = List(
     Compile.nativeLoader,
     Test.junitInterface
@@ -335,6 +343,12 @@ object Deps {
       Compile.akkaSlf4j
     )
 
+  val dlcSuredbitsClient = List(
+    Compile.akkaStream,
+    Compile.akkaHttp,
+    Compile.playJson
+  )
+
   val eclairRpc = List(
     Compile.akkaHttp,
     Compile.akkaStream,
@@ -400,6 +414,18 @@ object Deps {
       Compile.logback
     )
 
+  val dlcWallet =
+    List(
+      Compile.newMicroJson,
+      Compile.logback
+    )
+
+  val dlcWalletTest =
+    List(
+      Test.akkaTestkit,
+      Test.pgEmbedded
+    )
+
   val walletTest = List(
     Test.akkaTestkit,
     Test.pgEmbedded
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/BitcoinSTestAppConfig.scala b/testkit/src/main/scala/org/bitcoins/testkit/BitcoinSTestAppConfig.scala
index 91494ad992..9ed8537a4f 100644
--- a/testkit/src/main/scala/org/bitcoins/testkit/BitcoinSTestAppConfig.scala
+++ b/testkit/src/main/scala/org/bitcoins/testkit/BitcoinSTestAppConfig.scala
@@ -112,9 +112,10 @@ object BitcoinSTestAppConfig {
     case object Node extends ProjectType
     case object Chain extends ProjectType
     case object Oracle extends ProjectType
+    case object DLC extends ProjectType
     case object Test extends ProjectType
 
-    val all = List(Wallet, Node, Chain, Oracle, Test)
+    val all = List(Wallet, Node, Chain, Oracle, DLC, Test)
   }
 
   /** Generates a Typesafe config with DBs set to memory
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/core/gen/LnMessageGen.scala b/testkit/src/main/scala/org/bitcoins/testkit/core/gen/LnMessageGen.scala
index cc36893241..c01c43b4ff 100644
--- a/testkit/src/main/scala/org/bitcoins/testkit/core/gen/LnMessageGen.scala
+++ b/testkit/src/main/scala/org/bitcoins/testkit/core/gen/LnMessageGen.scala
@@ -52,6 +52,22 @@ trait LnMessageGen extends TLVGen {
     dlcSignTLV.map(LnMessage.apply)
   }
 
+  def dlcSignMessage(
+      offer: DLCOfferTLV,
+      accept: DLCAcceptTLV): Gen[LnMessage[DLCSignTLV]] = {
+    dlcSignTLV(offer, accept).map(LnMessage.apply)
+  }
+
+  def dlcOfferMessageAcceptMessageSignMessage: Gen[(
+      LnMessage[DLCOfferTLV],
+      LnMessage[DLCAcceptTLV],
+      LnMessage[DLCSignTLV])] = {
+    dlcOfferTLVAcceptTLVSignTLV.map {
+      case (offer, accept, sign) =>
+        (LnMessage(offer), LnMessage(accept), LnMessage(sign))
+    }
+  }
+
   def lnMessage: Gen[LnMessage[TLV]] = {
     Gen.oneOf(
       unknownMessage,
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/core/gen/TLVGen.scala b/testkit/src/main/scala/org/bitcoins/testkit/core/gen/TLVGen.scala
index 1268248768..c7f11ff2ce 100644
--- a/testkit/src/main/scala/org/bitcoins/testkit/core/gen/TLVGen.scala
+++ b/testkit/src/main/scala/org/bitcoins/testkit/core/gen/TLVGen.scala
@@ -3,8 +3,8 @@ package org.bitcoins.testkit.core.gen
 import org.bitcoins.commons.jsonmodels.dlc.DLCFundingInputP2WPKHV0
 import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.{
   ContractInfo,
-  DLCOffer,
-  SingleNonceContractInfo
+  DLCAccept,
+  DLCOffer
 }
 import org.bitcoins.core.config.Networks
 import org.bitcoins.core.currency.{Bitcoins, CurrencyUnit, Satoshis}
@@ -12,11 +12,15 @@ import org.bitcoins.core.number.UInt32
 import org.bitcoins.core.protocol.tlv._
 import org.bitcoins.core.protocol.transaction._
 import org.bitcoins.core.protocol.{BigSizeUInt, BlockTimeStamp}
-import org.bitcoins.core.util.NumberUtil
 import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
 import org.bitcoins.crypto.ECPrivateKey
+import org.bitcoins.dlc.builder.DLCTxBuilder
+import org.bitcoins.dlc.testgen.DLCTestUtil
 import org.scalacheck.Gen
 
+import scala.concurrent.duration.DurationInt
+import scala.concurrent.{Await, ExecutionContext}
+
 trait TLVGen {
 
   def unknownTpe: Gen[BigSizeUInt] = {
@@ -112,36 +116,6 @@ trait TLVGen {
   }
 
   def contractInfoV0TLV: Gen[ContractInfoV0TLV] = {
-    def genValues(size: Int, totalAmount: CurrencyUnit): Vector[Satoshis] = {
-      val vals = if (size < 2) {
-        throw new IllegalArgumentException(
-          s"Size must be at least two, got $size")
-      } else if (size == 2) {
-        Vector(totalAmount.satoshis, Satoshis.zero)
-      } else {
-        (0 until size - 2).map { _ =>
-          Satoshis(NumberUtil.randomLong(totalAmount.satoshis.toLong))
-        }.toVector :+ totalAmount.satoshis :+ Satoshis.zero
-      }
-
-      val valsWithOrder = vals.map(_ -> scala.util.Random.nextDouble())
-      valsWithOrder.sortBy(_._2).map(_._1)
-    }
-
-    def genContractInfos(outcomes: Vector[String], totalInput: CurrencyUnit): (
-        SingleNonceContractInfo,
-        SingleNonceContractInfo) = {
-      val outcomeMap =
-        outcomes
-          .map(EnumOutcome.apply)
-          .zip(genValues(outcomes.length, totalInput))
-
-      val info = SingleNonceContractInfo(outcomeMap)
-      val remoteInfo = info.flip(totalInput.satoshis)
-
-      (info, remoteInfo)
-    }
-
     for {
       numOutcomes <- Gen.choose(2, 10)
       outcomes <- Gen.listOfN(numOutcomes, StringGenerators.genString)
@@ -149,7 +123,8 @@ trait TLVGen {
         Gen
           .choose(numOutcomes + 1, Long.MaxValue / 10000L)
           .map(Satoshis.apply)
-      (contractInfo, _) = genContractInfos(outcomes.toVector, totalInput)
+      (contractInfo, _) =
+        DLCTestUtil.genContractInfos(outcomes.toVector, totalInput)
     } yield {
       ContractInfoV0TLV(contractInfo.outcomeValueMap.map {
         case (outcome, amt) => outcome.outcome -> amt
@@ -382,6 +357,42 @@ trait TLVGen {
     }
   }
 
+  def dlcSignTLV(offer: DLCOfferTLV, accept: DLCAcceptTLV): Gen[DLCSignTLV] = {
+    val contractInfo = ContractInfo.fromTLV(offer.contractInfo)
+
+    for {
+      cetSigs <- cetSignaturesV0TLV(contractInfo.allOutcomes.length)
+      refundSig <- CryptoGenerators.digitalSignature
+      fundingSigs <- fundingSignaturesV0TLV(offer.fundingInputs.length)
+    } yield {
+      val deserOffer = DLCOffer.fromTLV(offer)
+      val builder =
+        DLCTxBuilder(deserOffer,
+                     DLCAccept.fromTLV(accept, deserOffer).withoutSigs)(
+          ExecutionContext.global)
+      val fundingTx = Await.result(builder.buildFundingTx, 5.seconds)
+      val contractId = fundingTx.txIdBE.bytes.xor(accept.tempContractId.bytes)
+
+      DLCSignTLV(contractId, cetSigs, refundSig, fundingSigs)
+    }
+  }
+
+  def dlcOfferTLVAcceptTLVSignTLV: Gen[
+    (DLCOfferTLV, DLCAcceptTLV, DLCSignTLV)] = {
+    for {
+      (offer, accept) <- dlcOfferTLVAcceptTLV
+      sign <- dlcSignTLV(offer, accept)
+    } yield (offer, accept, sign)
+  }
+
+  def dlcOfferTLVAcceptTLVSignTLVWithOralceKeys: Gen[
+    (DLCOfferTLV, DLCAcceptTLV, DLCSignTLV, ECPrivateKey, ECPrivateKey)] = {
+    for {
+      (offer, accept, privKey, kValue) <- dlcOfferTLVAcceptTLVWithOracleKeys
+      sign <- dlcSignTLV(offer, accept)
+    } yield (offer, accept, sign, privKey, kValue)
+  }
+
   def tlv: Gen[TLV] = {
     Gen.oneOf(
       unknownTLV,
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/eclair/MockEclairClient.scala b/testkit/src/main/scala/org/bitcoins/testkit/eclair/MockEclairClient.scala
new file mode 100644
index 0000000000..0f4fdcbb8b
--- /dev/null
+++ b/testkit/src/main/scala/org/bitcoins/testkit/eclair/MockEclairClient.scala
@@ -0,0 +1,571 @@
+package org.bitcoins.testkit.eclair
+
+import java.net.InetSocketAddress
+import java.time.Instant
+import java.util.concurrent.locks.ReentrantReadWriteLock
+
+import org.bitcoins.commons.jsonmodels.eclair._
+import org.bitcoins.core.currency.{CurrencyUnit, Satoshis}
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.protocol.ln.LnParams.LnBitcoinRegTest
+import org.bitcoins.core.protocol.ln._
+import org.bitcoins.core.protocol.ln.channel.{ChannelId, FundedChannelId}
+import org.bitcoins.core.protocol.ln.currency.{LnCurrencyUnits, MilliSatoshis}
+import org.bitcoins.core.protocol.ln.node.NodeId
+import org.bitcoins.core.protocol.script.ScriptPubKey
+import org.bitcoins.core.protocol.{Address, BitcoinAddress}
+import org.bitcoins.core.util.BitcoinSLogger
+import org.bitcoins.core.wallet.fee.SatoshisPerByte
+import org.bitcoins.crypto.{
+  CryptoUtil,
+  DoubleSha256DigestBE,
+  ECPrivateKey,
+  ECPublicKey,
+  Sha256Digest
+}
+import org.bitcoins.eclair.rpc.api.EclairApi
+import org.bitcoins.eclair.rpc.network.NodeUri
+
+import scala.concurrent.duration.{FiniteDuration, _}
+import scala.concurrent.{ExecutionContext, Future}
+
+class MockEclairClient()(implicit
+    override val executionContext: ExecutionContext)
+    extends EclairApi
+    with BitcoinSLogger {
+  private def now: Instant = Instant.now
+
+  private val privKey: ECPrivateKey = ECPrivateKey.freshPrivateKey
+
+  private val readWriteLock = new ReentrantReadWriteLock
+  private val readLock = readWriteLock.readLock
+  private val writeLock = readWriteLock.writeLock
+
+  private var paymentsById =
+    Map.empty[PaymentId, Vector[OutgoingPayment]].withDefaultValue(Vector.empty)
+
+  private var paymentsByHash = Map
+    .empty[Sha256Digest, Vector[OutgoingPayment]]
+    .withDefaultValue(Vector.empty)
+
+  private var preImagesByHash: Map[LnTag.PaymentHashTag, PaymentPreimage] =
+    Map.empty
+
+  private var outgoingPayments: Vector[OutgoingPayment] = Vector.empty
+
+  private var incomingPayments: Vector[IncomingPayment] = Vector.empty
+
+  var otherClient: Option[MockEclairClient] = None
+
+  def preImage(hashTag: LnTag.PaymentHashTag): PaymentPreimage = {
+    readLock.lock()
+    try {
+      preImagesByHash(hashTag)
+    } finally {
+      readLock.unlock()
+    }
+  }
+
+  def outgoingPayment(hash: LnTag.PaymentHashTag): OutgoingPayment = {
+    readLock.lock()
+    try {
+      paymentsByHash(hash.hash).head
+    } finally {
+      readLock.unlock()
+    }
+  }
+
+  def incomingPayment(hash: LnTag.PaymentHashTag): IncomingPayment = {
+    readLock.lock()
+    try {
+      incomingPayments.find(_.paymentRequest.paymentHash == hash.hash).get
+    } finally {
+      readLock.unlock()
+    }
+  }
+
+  private def toPaymentRequest(invoice: LnInvoice): PaymentRequest = {
+    PaymentRequest(
+      prefix = invoice.hrp,
+      timestamp = java.time.Instant.ofEpochSecond(invoice.timestamp.toLong),
+      nodeId = invoice.nodeId,
+      serialized = invoice.toString(),
+      description = invoice.lnTags.description.get.string,
+      paymentHash = invoice.lnTags.paymentHash.hash,
+      0.seconds,
+      amount = invoice.amount.map(_.toMSat)
+    )
+  }
+
+  def receiveIncomingPayment(
+      invoice: LnInvoice
+  ): Unit = {
+    readLock.lock()
+    val incoming =
+      try {
+        IncomingPayment(
+          toPaymentRequest(invoice),
+          paymentPreimage = preImagesByHash(invoice.lnTags.paymentHash),
+          createdAt = now,
+          status = IncomingPaymentStatus
+            .Received(invoice.amount.getOrElse(LnCurrencyUnits.zero).toMSat,
+                      now)
+        )
+      } finally {
+        readLock.unlock()
+      }
+
+    writeLock.lock()
+    incomingPayments = incomingPayments.:+(incoming)
+    writeLock.unlock()
+  }
+
+  private val unsupportedFailure: Future[Nothing] = {
+    Future.failed(
+      new UnsupportedOperationException(
+        "MockEcliarClient does not support this function yet"
+      )
+    )
+  }
+
+  override def audit(): Future[AuditResult] = audit(None, None)
+
+  override def audit(
+      from: Option[Instant],
+      to: Option[Instant]): Future[AuditResult] =
+    Future.successful(AuditResult(Vector.empty, Vector.empty, Vector.empty))
+
+  override def allUpdates(): Future[Vector[ChannelUpdate]] =
+    Future.successful(Vector.empty)
+
+  override def allUpdates(nodeId: NodeId): Future[Vector[ChannelUpdate]] =
+    Future.successful(Vector.empty)
+
+  override val network: LnParams = LnBitcoinRegTest
+
+  override def createInvoice(
+      description: String,
+      amountMsat: Option[MilliSatoshis],
+      expireIn: Option[FiniteDuration],
+      fallbackAddress: Option[Address],
+      paymentPreimage: Option[PaymentPreimage]): Future[LnInvoice] = {
+
+    val hrp = LnHumanReadablePart.fromParamsAmount(
+      network = LnParams.LnBitcoinRegTest,
+      amount = amountMsat.map(_.toLnCurrencyUnit)
+    )
+
+    val preImage = paymentPreimage.getOrElse(PaymentPreimage.random)
+    val hash = CryptoUtil.sha256(preImage.bytes)
+    val hashTag = LnTag.PaymentHashTag(hash)
+
+    nodeId().map { id =>
+      val taggedFields = LnTaggedFields(
+        paymentHash = hashTag,
+        descriptionOrHash = Left(LnTag.DescriptionTag(description)),
+        nodeId = Some(LnTag.NodeIdTag(id)),
+        expiryTime =
+          expireIn.map(x => LnTag.ExpiryTimeTag(UInt32(x.toSeconds))),
+        cltvExpiry = None,
+        fallbackAddress = None,
+        routingInfo = None
+      )
+
+      val invoice = LnInvoice.build(
+        hrp = hrp,
+        lnTags = taggedFields,
+        privateKey = privKey
+      )
+
+      writeLock.lock()
+      preImagesByHash = preImagesByHash.updated(hashTag, preImage)
+      writeLock.unlock()
+
+      invoice
+    }
+  }
+
+  /**
+    * Emulates a direct channel
+    */
+  override def findRoute(
+      nodeId: NodeId,
+      amountMsat: MilliSatoshis): Future[Vector[NodeId]] = {
+    val route = (1 to 2).map(_ => NodeId.fromPubKey(ECPublicKey.freshPublicKey))
+    Future.successful(route.toVector)
+  }
+
+  override def findRoute(invoice: LnInvoice): Future[Vector[NodeId]] = {
+    val route = (1 to 2).map(_ => NodeId.fromPubKey(ECPublicKey.freshPublicKey))
+    Future.successful(route.toVector)
+  }
+
+  override def findRoute(
+      invoice: LnInvoice,
+      amountMsat: MilliSatoshis): Future[Vector[NodeId]] = {
+    val route = (1 to 2).map(_ => NodeId.fromPubKey(ECPublicKey.freshPublicKey))
+    Future.successful(route.toVector)
+  }
+
+  override def payInvoice(invoice: LnInvoice): Future[PaymentId] = {
+    val paymentId = PaymentId(java.util.UUID.randomUUID())
+    val nodeId = invoice.nodeId
+    val amountMsat = invoice.amount.getOrElse(LnCurrencyUnits.zero).toMSat
+    val paymentHash = invoice.lnTags.paymentHash.hash
+
+    val outgoingPaymentStatus = otherClient match {
+      case Some(payee) =>
+        val status = OutgoingPaymentStatus.Succeeded(
+          paymentPreimage = payee.preImagesByHash(invoice.lnTags.paymentHash),
+          feesPaid = MilliSatoshis.zero,
+          route = Vector.empty,
+          completedAt = now)
+
+        payee.receiveIncomingPayment(invoice)
+
+        status
+      case None =>
+        OutgoingPaymentStatus.Failed(failures = Vector.empty)
+    }
+
+    val outgoingPayment = OutgoingPayment(
+      id = paymentId,
+      parentId = paymentId,
+      externalId = Some(paymentId.toString()),
+      paymentHash = paymentHash,
+      amount = amountMsat,
+      createdAt = now,
+      paymentRequest = Some(toPaymentRequest(invoice)),
+      status = outgoingPaymentStatus,
+      recipientAmount = amountMsat,
+      recipientNodeId = nodeId,
+      paymentType = PaymentType.Standard
+    )
+
+    writeLock.lock()
+    outgoingPayments = outgoingPayments.:+(outgoingPayment)
+    paymentsById = paymentsById.updated(paymentId, Vector(outgoingPayment))
+    paymentsByHash = paymentsByHash
+      .updated(paymentHash, outgoingPayment +: paymentsByHash(paymentHash))
+    writeLock.unlock()
+
+    Future.successful(paymentId)
+  }
+
+  override def payInvoice(
+      invoice: LnInvoice,
+      amt: MilliSatoshis
+  ): Future[PaymentId] = {
+    unsupportedFailure
+  }
+
+  override def createInvoice(description: String): Future[LnInvoice] =
+    createInvoice(description, None, None, None, None)
+
+  override def createInvoice(
+      description: String,
+      amountMsat: MilliSatoshis): Future[LnInvoice] =
+    createInvoice(description, Some(amountMsat), None, None, None)
+
+  override def createInvoice(
+      description: String,
+      amountMsat: MilliSatoshis,
+      expiryIn: FiniteDuration
+  ): Future[LnInvoice] =
+    createInvoice(description, Some(amountMsat), Some(expiryIn), None, None)
+
+  override def createInvoice(
+      description: String,
+      amountMsat: MilliSatoshis,
+      paymentPreimage: PaymentPreimage): Future[LnInvoice] =
+    createInvoice(description,
+                  Some(amountMsat),
+                  None,
+                  None,
+                  Some(paymentPreimage))
+
+  override def createInvoice(
+      description: String,
+      amountMsat: MilliSatoshis,
+      expireIn: FiniteDuration,
+      paymentPreimage: PaymentPreimage): Future[LnInvoice] =
+    createInvoice(description,
+                  Some(amountMsat),
+                  Some(expireIn),
+                  None,
+                  Some(paymentPreimage))
+
+  override def getSentInfo(
+      paymentHash: Sha256Digest): Future[Vector[OutgoingPayment]] =
+    Future {
+      readLock.lock()
+      try {
+        paymentsByHash(paymentHash)
+      } finally {
+        readLock.unlock()
+      }
+    }
+
+  override def getSentInfo(id: PaymentId): Future[Vector[OutgoingPayment]] =
+    Future {
+      readLock.lock()
+      try {
+        paymentsById(id)
+      } finally {
+        readLock.unlock()
+      }
+    }
+
+  override def monitorInvoice(
+      lnInvoice: LnInvoice,
+      interval: FiniteDuration,
+      maxAttempts: Int
+  ): Future[IncomingPayment] = {
+    val paymentOpt = incomingPayments.find(incoming =>
+      incoming.paymentRequest.paymentHash == lnInvoice.lnTags.paymentHash.hash)
+    paymentOpt match {
+      case Some(payment) => Future.successful(payment)
+      case None =>
+        if (maxAttempts <= 0) {
+          Future.failed(
+            new RuntimeException(s"No incoming payment for $lnInvoice"))
+        } else {
+          Thread.sleep(interval.toMillis)
+          monitorInvoice(lnInvoice, interval, maxAttempts - 1)
+        }
+    }
+  }
+
+  override def monitorSentPayment(
+      paymentId: PaymentId,
+      interval: FiniteDuration,
+      maxAttempts: Int): Future[OutgoingPayment] = {
+    for {
+      results <- getSentInfo(paymentId)
+    } yield {
+
+      val result = results.filter(_.parentId == paymentId)
+      result.last
+    }
+  }
+
+  override def payAndMonitorInvoice(
+      invoice: LnInvoice,
+      externalId: Option[String],
+      interval: FiniteDuration,
+      maxAttempts: Int): Future[OutgoingPayment] = {
+    val paidF = payInvoice(invoice)
+    paidF.map { id =>
+      readLock.lock()
+      try {
+        paymentsById(id).head
+      } finally {
+        readLock.unlock()
+      }
+    }
+
+  }
+
+  override def payAndMonitorInvoice(
+      invoice: LnInvoice,
+      amount: MilliSatoshis,
+      externalId: Option[String],
+      interval: FiniteDuration,
+      maxAttempts: Int): Future[OutgoingPayment] = {
+    val paidF = payInvoice(invoice, amount)
+    paidF.map { id =>
+      readLock.lock()
+      try {
+        paymentsById(id).head
+      } finally {
+        readLock.unlock()
+      }
+    }
+  }
+
+  override def getNewAddress(): Future[BitcoinAddress] = {
+    unsupportedFailure
+  }
+
+  override def getInfo: Future[GetInfoResult] =
+    unsupportedFailure
+
+  override def updateRelayFee(
+      channelId: ChannelId,
+      feeBaseMsat: MilliSatoshis,
+      feePropertionalMillionths: Long
+  ): Future[ChannelCommandResult] =
+    unsupportedFailure
+
+  override def updateRelayFee(
+      shortChannelId: ShortChannelId,
+      feeBaseMsat: MilliSatoshis,
+      feePropertionalMillionths: Long
+  ): Future[ChannelCommandResult] =
+    unsupportedFailure
+
+  override def payInvoice(
+      invoice: LnInvoice,
+      amountMsat: Option[MilliSatoshis],
+      maxAttempts: Option[Int],
+      feeThresholdSat: Option[Satoshis],
+      maxFeePct: Option[Int],
+      externalId: Option[String]): Future[PaymentId] =
+    unsupportedFailure
+
+  override def payInvoice(
+      invoice: LnInvoice,
+      externalId: Option[String]): Future[PaymentId] = {
+    unsupportedFailure
+  }
+
+  override def payInvoice(
+      invoice: LnInvoice,
+      amount: MilliSatoshis,
+      externalId: Option[String]): Future[PaymentId] = {
+    unsupportedFailure
+  }
+
+  override def isConnected(nodeId: NodeId): Future[Boolean] =
+    unsupportedFailure
+
+  override def listPendingInvoices(
+      from: Option[Instant],
+      to: Option[Instant]
+  ): Future[Vector[LnInvoice]] =
+    unsupportedFailure
+
+  override def connectToWebSocket(
+      eventHandler: WebSocketEvent => Unit): scala.concurrent.Future[Unit] = {
+    unsupportedFailure
+  }
+
+  override def connect(nodeId: NodeId): Future[Unit] = {
+    unsupportedFailure
+  }
+
+  override def connect(
+      nodeId: NodeId,
+      addr: InetSocketAddress): Future[Unit] = {
+    unsupportedFailure
+  }
+
+  override def connect(nodeURI: NodeUri): Future[Unit] =
+    unsupportedFailure
+
+  override def connect(nodeId: NodeId, host: String, port: Int): Future[Unit] =
+    unsupportedFailure
+
+  override def getInvoice(paymentHash: Sha256Digest): Future[LnInvoice] =
+    unsupportedFailure
+
+  override def allChannels(): Future[Vector[ChannelDesc]] =
+    unsupportedFailure
+
+  override def allNodes(): Future[Vector[NodeInfo]] =
+    unsupportedFailure
+
+  override def sendToNode(
+      nodeId: NodeId,
+      amountMsat: MilliSatoshis,
+      paymentHash: Sha256Digest,
+      maxAttempts: Option[Int],
+      feeThresholdSat: Option[Satoshis],
+      maxFeePct: Option[Int],
+      externalId: Option[String]): Future[PaymentId] =
+    unsupportedFailure
+
+  override def sendToRoute(
+      invoice: LnInvoice,
+      route: scala.collection.immutable.Seq[NodeId],
+      amountMsat: MilliSatoshis,
+      paymentHash: Sha256Digest,
+      finalCltvExpiry: Long,
+      recipientAmountMsat: Option[MilliSatoshis],
+      parentId: Option[PaymentId],
+      externalId: Option[String]): Future[SendToRouteResult] = {
+    unsupportedFailure
+  }
+
+  override def forceClose(channelId: ChannelId): Future[ChannelCommandResult] =
+    unsupportedFailure
+
+  override def forceClose(
+      shortChannelId: ShortChannelId): Future[ChannelCommandResult] =
+    unsupportedFailure
+
+  override def close(
+      id: ChannelId,
+      spk: ScriptPubKey): Future[ChannelCommandResult] =
+    unsupportedFailure
+
+  override def usableBalances(): Future[Vector[UsableBalancesResult]] =
+    unsupportedFailure
+
+  override lazy val getNodeURI: Future[NodeUri] = {
+    val uri =
+      NodeUri(NodeId(privKey.publicKey), "MOCK", scala.util.Random.nextInt())
+    Future.successful(uri)
+  }
+
+  override def networkFees(
+      from: Option[FiniteDuration],
+      to: Option[FiniteDuration]): Future[Vector[NetworkFeesResult]] = {
+    unsupportedFailure
+  }
+
+  override def disconnect(nodeId: NodeId): Future[Unit] =
+    unsupportedFailure
+
+  override def channels(nodeId: NodeId): Future[Vector[ChannelInfo]] =
+    unsupportedFailure
+
+  override def channel(id: ChannelId): Future[ChannelResult] =
+    unsupportedFailure
+
+  override def open(
+      nodeId: NodeId,
+      funding: CurrencyUnit,
+      pushMsat: Option[MilliSatoshis],
+      feerateSatPerByte: Option[SatoshisPerByte],
+      channelFlags: Option[Byte],
+      openTimeout: Option[FiniteDuration]): Future[FundedChannelId] = {
+    unsupportedFailure
+  }
+
+  override def getPeers: Future[Vector[PeerInfo]] =
+    unsupportedFailure
+
+  override def parseInvoice(invoice: LnInvoice): Future[InvoiceResult] =
+    unsupportedFailure
+
+  override def getReceivedInfo(
+      paymentHash: Sha256Digest
+  ): Future[Option[IncomingPayment]] =
+    unsupportedFailure
+
+  override def getReceivedInfo(
+      invoice: LnInvoice
+  ): Future[Option[IncomingPayment]] =
+    unsupportedFailure
+
+  override def channelStats(): Future[Vector[ChannelStats]] =
+    unsupportedFailure
+
+  override def listInvoices(
+      from: Option[Instant],
+      to: Option[Instant]
+  ): Future[Vector[LnInvoice]] =
+    unsupportedFailure
+
+  override def onChainBalance(): Future[OnChainBalance] = unsupportedFailure
+
+  override def onChainTransactions(): Future[Vector[WalletTransaction]] =
+    unsupportedFailure
+
+  override def sendOnChain(
+      address: BitcoinAddress,
+      amount: Satoshis,
+      confirmationTarget: Int): Future[DoubleSha256DigestBE] =
+    unsupportedFailure
+}
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/fixtures/DLCDAOFixture.scala b/testkit/src/main/scala/org/bitcoins/testkit/fixtures/DLCDAOFixture.scala
new file mode 100644
index 0000000000..849288f5f9
--- /dev/null
+++ b/testkit/src/main/scala/org/bitcoins/testkit/fixtures/DLCDAOFixture.scala
@@ -0,0 +1,63 @@
+package org.bitcoins.testkit.fixtures
+
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import org.bitcoins.dlc.wallet.models._
+import org.bitcoins.testkit.wallet.BitcoinSWalletTest
+import org.scalatest._
+
+import scala.concurrent.Future
+
+case class DLCDAOs(
+    dlcDAO: DLCDAO,
+    dlcOfferDAO: DLCOfferDAO,
+    dlcAcceptDAO: DLCAcceptDAO,
+    dlcInputsDAO: DLCFundingInputDAO,
+    dlcSigsDAO: DLCCETSignatureDAO,
+    dlcRefundSigDAO: DLCRefundSigDAO,
+    dlcRemoteTxDAO: DLCRemoteTxDAO)
+
+trait DLCDAOFixture extends BitcoinSWalletTest {
+
+  private lazy val daos: DLCDAOs = {
+    val dlc = DLCDAO()
+    val dlcOfferDAO = DLCOfferDAO()
+    val dlcAcceptDAO = DLCAcceptDAO()
+    val dlcInputsDAO = DLCFundingInputDAO()
+    val dlcSigsDAO = DLCCETSignatureDAO()
+    val dlcRefundSigDAO = DLCRefundSigDAO()
+    val dlcRemoteTxDAO = DLCRemoteTxDAO()
+    DLCDAOs(
+      dlcDAO = dlc,
+      dlcOfferDAO = dlcOfferDAO,
+      dlcAcceptDAO = dlcAcceptDAO,
+      dlcInputsDAO = dlcInputsDAO,
+      dlcSigsDAO = dlcSigsDAO,
+      dlcRefundSigDAO = dlcRefundSigDAO,
+      dlcRemoteTxDAO = dlcRemoteTxDAO
+    )
+  }
+
+  final override type FixtureParam = DLCDAOs
+
+  implicit private val dlcConfig: DLCAppConfig = config.dlcConf
+
+  override def afterAll(): Unit = {
+    super.afterAll()
+  }
+
+  def withFixture(test: OneArgAsyncTest): FutureOutcome =
+    makeFixture(build = () => Future(dlcConfig.migrate()).map(_ => daos),
+                destroy = () => dropAll())(test)
+
+  def dropAll(): Future[Unit] = {
+    val res = for {
+      _ <- dlcConfig.dropTable("flyway_schema_history")
+      _ <- dlcConfig.dropAll()
+    } yield ()
+    res.failed.foreach { ex =>
+      ex.printStackTrace()
+    }
+    res
+  }
+
+}
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/util/BytesUtil.scala b/testkit/src/main/scala/org/bitcoins/testkit/util/BytesUtil.scala
new file mode 100644
index 0000000000..eacceb0f93
--- /dev/null
+++ b/testkit/src/main/scala/org/bitcoins/testkit/util/BytesUtil.scala
@@ -0,0 +1,25 @@
+package org.bitcoins.testkit.util
+
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.crypto.{ECAdaptorSignature, ECDigitalSignature}
+import org.bitcoins.dlc.testgen.DLCTestUtil
+import scodec.bits.ByteVector
+
+object BytesUtil {
+
+  def flipAtIndex(bytes: ByteVector, byteIndex: Int): ByteVector = {
+    DLCTestUtil.flipAtIndex(bytes, byteIndex)
+  }
+
+  def flipBit(signature: ECDigitalSignature): ECDigitalSignature = {
+    DLCTestUtil.flipBit(signature)
+  }
+
+  def flipBit(partialSignature: PartialSignature): PartialSignature = {
+    DLCTestUtil.flipBit(partialSignature)
+  }
+
+  def flipBit(adaptorSignature: ECAdaptorSignature): ECAdaptorSignature = {
+    DLCTestUtil.flipBit(adaptorSignature)
+  }
+}
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSDualWalletTest.scala b/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSDualWalletTest.scala
new file mode 100644
index 0000000000..6763bb33a7
--- /dev/null
+++ b/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSDualWalletTest.scala
@@ -0,0 +1,107 @@
+package org.bitcoins.testkit.wallet
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage.OracleAndContractInfo
+import org.bitcoins.core.currency.Satoshis
+import org.bitcoins.db.AppConfig
+import org.bitcoins.dlc.testgen.DLCTestUtil
+import org.bitcoins.dlc.wallet.DLCAppConfig
+import org.bitcoins.server.BitcoinSAppConfig
+import org.bitcoins.testkit.BitcoinSTestAppConfig
+import org.bitcoins.testkit.wallet.DLCWalletUtil.InitializedDLCWallet
+import org.bitcoins.testkit.wallet.FundWalletUtil.FundedDLCWallet
+import org.bitcoins.wallet.config.WalletAppConfig
+import org.scalatest.FutureOutcome
+
+trait BitcoinSDualWalletTest extends BitcoinSWalletTest {
+  import BitcoinSWalletTest._
+
+  implicit protected def config2: BitcoinSAppConfig =
+    BitcoinSTestAppConfig.getSpvTestConfig()
+
+  implicit protected def wallet2AppConfig: WalletAppConfig = {
+    config2.walletConf
+  }
+
+  implicit protected def dlc2AppConfig: DLCAppConfig = {
+    config2.dlcConf
+  }
+
+  override def beforeAll(): Unit = {
+    AppConfig.throwIfDefaultDatadir(config.walletConf)
+    AppConfig.throwIfDefaultDatadir(config2.walletConf)
+    AppConfig.throwIfDefaultDatadir(config.dlcConf)
+    AppConfig.throwIfDefaultDatadir(config2.dlcConf)
+    super.beforeAll()
+  }
+
+  /** Creates two segwit wallets that are funded with some bitcoin, these wallets are NOT
+    * peered with a bitcoind so the funds in the wallets are not tied to an
+    * underlying blockchain
+    */
+  def withDualFundedDLCWallets(test: OneArgAsyncTest): FutureOutcome = {
+    makeDependentFixture(
+      build = () =>
+        for {
+          walletA <-
+            FundWalletUtil.createFundedDLCWallet(nodeApi,
+                                                 chainQueryApi,
+                                                 getBIP39PasswordOpt(),
+                                                 Some(segwitWalletConf))
+          walletB <- FundWalletUtil.createFundedDLCWallet(
+            nodeApi,
+            chainQueryApi,
+            getBIP39PasswordOpt(),
+            Some(segwitWalletConf))(config2, system)
+        } yield (walletA, walletB),
+      destroy = { fundedWallets: (FundedDLCWallet, FundedDLCWallet) =>
+        for {
+          _ <- destroyWallet(fundedWallets._1.wallet)
+          _ <- destroyWallet(fundedWallets._2.wallet)
+        } yield ()
+      }
+    )(test)
+  }
+
+  /** Creates 2 funded segwit wallets that have a DLC initiated */
+  def withDualDLCWallets(
+      test: OneArgAsyncTest,
+      multiNonce: Boolean): FutureOutcome = {
+    makeDependentFixture(
+      build = () =>
+        for {
+          walletA <-
+            FundWalletUtil.createFundedDLCWallet(nodeApi,
+                                                 chainQueryApi,
+                                                 getBIP39PasswordOpt(),
+                                                 Some(segwitWalletConf))
+          walletB <- FundWalletUtil.createFundedDLCWallet(
+            nodeApi,
+            chainQueryApi,
+            getBIP39PasswordOpt(),
+            Some(segwitWalletConf))(config2, system)
+
+          oracleAndContractInfo =
+            if (multiNonce) {
+              DLCWalletUtil.multiNonceOracleAndContractInfo
+            } else {
+              val numOutcomes = 8
+              val outcomes = DLCTestUtil.genOutcomes(numOutcomes)
+              val (contractInfo, _) =
+                DLCTestUtil.genContractInfos(outcomes, Satoshis(10000))
+
+              OracleAndContractInfo(DLCWalletUtil.sampleOracleInfo,
+                                    contractInfo)
+            }
+
+          (dlcWalletA, dlcWalletB) <-
+            DLCWalletUtil.initDLC(walletA, walletB, oracleAndContractInfo)
+        } yield (dlcWalletA, dlcWalletB),
+      destroy = { dlcWallets: (InitializedDLCWallet, InitializedDLCWallet) =>
+        for {
+          _ <- destroyWallet(dlcWallets._1.wallet)
+          _ <- destroyWallet(dlcWallets._2.wallet)
+        } yield ()
+      }
+    )(test)
+  }
+}
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSWalletTest.scala b/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSWalletTest.scala
index ad8f970743..88fae9cb0d 100644
--- a/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSWalletTest.scala
+++ b/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSWalletTest.scala
@@ -14,6 +14,7 @@ import org.bitcoins.core.util.FutureUtil
 import org.bitcoins.core.wallet.fee._
 import org.bitcoins.crypto.{DoubleSha256Digest, DoubleSha256DigestBE}
 import org.bitcoins.db.AppConfig
+import org.bitcoins.dlc.wallet.{DLCAppConfig, DLCWallet}
 import org.bitcoins.keymanager.bip39.BIP39KeyManager
 import org.bitcoins.rpc.client.common.{BitcoindRpcClient, BitcoindVersion}
 import org.bitcoins.rpc.client.v19.BitcoindV19RpcClient
@@ -45,8 +46,13 @@ trait BitcoinSWalletTest extends BitcoinSFixture with EmbeddedPg {
     config.walletConf
   }
 
+  implicit protected def dlcAppConfig: DLCAppConfig = {
+    config.dlcConf
+  }
+
   override def beforeAll(): Unit = {
     AppConfig.throwIfDefaultDatadir(config.walletConf)
+    AppConfig.throwIfDefaultDatadir(config.dlcConf)
     super[EmbeddedPg].beforeAll()
   }
 
@@ -54,6 +60,7 @@ trait BitcoinSWalletTest extends BitcoinSFixture with EmbeddedPg {
     Await.result(config.chainConf.stop(), 1.minute)
     Await.result(config.nodeConf.stop(), 1.minute)
     Await.result(config.walletConf.stop(), 1.minute)
+    Await.result(config.dlcConf.stop(), 1.minute)
     super[EmbeddedPg].afterAll()
   }
 
@@ -423,6 +430,40 @@ object BitcoinSWalletTest extends WalletLogger {
       }
     }
 
+  private def createDLCWallet(
+      keyManager: BIP39KeyManager,
+      bip39PasswordOpt: Option[String],
+      extraConfig: Option[Config],
+      nodeApi: NodeApi,
+      chainQueryApi: ChainQueryApi)(implicit
+      config: BitcoinSAppConfig,
+      ec: ExecutionContext): Future[DLCWallet] = {
+    val defaultConf = config.walletConf
+    val walletConfig = extraConfig match {
+      case None    => defaultConf
+      case Some(c) => defaultConf.withOverrides(c)
+    }
+
+    // we want to check we're not overwriting
+    // any user data
+    AppConfig.throwIfDefaultDatadir(walletConfig)
+
+    val initConfs = for {
+      _ <- walletConfig.start()
+      _ <- config.dlcConf.start()
+    } yield ()
+
+    initConfs.flatMap { _ =>
+      val wallet =
+        DLCWallet(keyManager,
+                  nodeApi,
+                  chainQueryApi,
+                  new RandomFeeProvider,
+                  keyManager.creationTime)(walletConfig, config.dlcConf, ec)
+      Wallet.initialize(wallet, bip39PasswordOpt).map(_.asInstanceOf[DLCWallet])
+    }
+  }
+
   /** Creates a wallet with the default configuration */
   def createDefaultWallet(
       nodeApi: NodeApi,
@@ -510,6 +551,30 @@ object BitcoinSWalletTest extends WalletLogger {
 
   }
 
+  def createDLCWallet2Accounts(
+      nodeApi: NodeApi,
+      chainQueryApi: ChainQueryApi,
+      bip39PasswordOpt: Option[String],
+      extraConfig: Option[Config] = None)(implicit
+      config: BitcoinSAppConfig,
+      system: ActorSystem): Future[DLCWallet] = {
+    implicit val ec: ExecutionContextExecutor = system.dispatcher
+    val km =
+      createNewKeyManager(bip39PasswordOpt = bip39PasswordOpt)(
+        config.walletConf)
+    for {
+      wallet <- createDLCWallet(km,
+                                bip39PasswordOpt,
+                                extraConfig,
+                                nodeApi,
+                                chainQueryApi)
+      account1 = WalletTestUtil.getHdAccount1(wallet.walletConfig)
+      newAccountWallet <- wallet.createNewAccount(hdAccount = account1,
+                                                  kmParams =
+                                                    wallet.keyManager.kmParams)
+    } yield newAccountWallet.asInstanceOf[DLCWallet]
+  }
+
   /** Pairs the given wallet with a bitcoind instance that has money in the bitcoind wallet */
   def createWalletWithBitcoind(
       wallet: Wallet
@@ -661,9 +726,8 @@ object BitcoinSWalletTest extends WalletLogger {
   }
 
   def destroyWallet(wallet: Wallet): Future[Unit] = {
-    import wallet.walletConfig.ec
+    import wallet.ec
     for {
-
       _ <- wallet.walletConfig.dropTable("flyway_schema_history")
       _ <- wallet.walletConfig.dropAll()
       _ <- wallet.stop()
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/wallet/DLCWalletUtil.scala b/testkit/src/main/scala/org/bitcoins/testkit/wallet/DLCWalletUtil.scala
new file mode 100644
index 0000000000..b7ac60f76e
--- /dev/null
+++ b/testkit/src/main/scala/org/bitcoins/testkit/wallet/DLCWalletUtil.scala
@@ -0,0 +1,286 @@
+package org.bitcoins.testkit.wallet
+
+import org.bitcoins.commons.jsonmodels.dlc.DLCMessage._
+import org.bitcoins.commons.jsonmodels.dlc._
+import org.bitcoins.core.crypto.WitnessTxSigComponent
+import org.bitcoins.core.currency._
+import org.bitcoins.core.hd.{BIP32Path, HDAccount}
+import org.bitcoins.core.number.UInt32
+import org.bitcoins.core.policy.Policy
+import org.bitcoins.core.protocol.script.{P2WPKHWitnessSPKV0, P2WPKHWitnessV0}
+import org.bitcoins.core.protocol.tlv.{DLCOutcomeType, EnumOutcome}
+import org.bitcoins.core.protocol.transaction._
+import org.bitcoins.core.protocol.{BitcoinAddress, BlockTimeStamp}
+import org.bitcoins.core.psbt.InputPSBTRecord.PartialSignature
+import org.bitcoins.core.script.PreExecutionScriptProgram
+import org.bitcoins.core.script.interpreter.ScriptInterpreter
+import org.bitcoins.core.wallet.fee.SatoshisPerVirtualByte
+import org.bitcoins.crypto._
+import org.bitcoins.dlc.testgen.DLCTestUtil
+import org.bitcoins.dlc.wallet.DLCWallet
+import org.bitcoins.dlc.wallet.models._
+import org.bitcoins.testkit.wallet.FundWalletUtil.FundedDLCWallet
+import org.scalatest.Assertions.fail
+import scodec.bits.ByteVector
+
+import scala.concurrent.{ExecutionContext, Future}
+
+object DLCWalletUtil {
+  lazy val oraclePrivKey: ECPrivateKey = ECPrivateKey.freshPrivateKey
+
+  lazy val kValues: Vector[ECPrivateKey] =
+    0.to(10).map(_ => ECPrivateKey.freshPrivateKey).toVector
+  lazy val rValues: Vector[SchnorrNonce] = kValues.map(_.schnorrNonce)
+
+  lazy val kValue: ECPrivateKey = kValues.head
+  lazy val rValue: SchnorrNonce = rValues.head
+
+  lazy val winStr: String = "WIN"
+  lazy val loseStr: String = "LOSE"
+
+  lazy val winHash: Sha256Digest =
+    CryptoUtil.sha256(winStr)
+
+  lazy val loseHash: Sha256Digest =
+    CryptoUtil.sha256(loseStr)
+
+  lazy val sampleOracleInfo: OracleInfo =
+    SingleNonceOracleInfo(oraclePrivKey.schnorrPublicKey, rValue)
+
+  lazy val sampleContractInfo: ContractInfo =
+    SingleNonceContractInfo.fromStringVec(
+      Vector(winStr -> Satoshis(10000), loseStr -> Satoshis.zero))
+
+  lazy val sampleOracleAndContractInfo: OracleAndContractInfo =
+    OracleAndContractInfo(sampleOracleInfo, sampleContractInfo)
+
+  lazy val sampleOracleWinSig: SchnorrDigitalSignature =
+    oraclePrivKey.schnorrSignWithNonce(winHash.bytes, kValue)
+
+  lazy val sampleOracleLoseSig: SchnorrDigitalSignature =
+    oraclePrivKey.schnorrSignWithNonce(loseHash.bytes, kValue)
+
+  val numDigits: Int = 6
+
+  lazy val multiNonceContractInfo: MultiNonceContractInfo =
+    DLCTestUtil.genMultiDigitContractInfo(numDigits, Satoshis(10000))._1
+
+  lazy val multiNonceOracleInfo: MultiNonceOracleInfo =
+    MultiNonceOracleInfo(oraclePrivKey.schnorrPublicKey,
+                         rValues.take(numDigits))
+
+  lazy val multiNonceOracleAndContractInfo: OracleAndContractInfo =
+    OracleAndContractInfo(multiNonceOracleInfo, multiNonceContractInfo)
+
+  lazy val dummyContractMaturity: BlockTimeStamp = BlockTimeStamp(1666335)
+  lazy val dummyContractTimeout: BlockTimeStamp = BlockTimeStamp(1666337)
+
+  lazy val dummyTimeouts: DLCTimeouts =
+    DLCTimeouts(dummyContractMaturity, dummyContractTimeout)
+
+  lazy val dummyKey: ECPublicKey = ECPublicKey.freshPublicKey
+
+  lazy val dummyKey2: ECPublicKey = ECPublicKey.freshPublicKey
+
+  lazy val dummyPartialSig: PartialSignature =
+    PartialSignature(dummyKey, DummyECDigitalSignature)
+
+  lazy val dummyScriptWitness: P2WPKHWitnessV0 = {
+    P2WPKHWitnessV0(dummyPartialSig.pubKey, dummyPartialSig.signature)
+  }
+
+  lazy val dummyAddress: BitcoinAddress = BitcoinAddress(
+    "bc1quq29mutxkgxmjfdr7ayj3zd9ad0ld5mrhh89l2")
+
+  lazy val dummyDLCKeys: DLCPublicKeys =
+    DLCPublicKeys(dummyKey, dummyAddress)
+
+  lazy val dummyBlockHash: DoubleSha256DigestBE = DoubleSha256DigestBE(
+    "00000000496dcc754fabd97f3e2df0a7337eab417d75537fecf97a7ebb0e7c75")
+
+  val dummyPrevTx: BaseTransaction = BaseTransaction(
+    TransactionConstants.validLockVersion,
+    Vector.empty,
+    Vector.fill(2)(
+      TransactionOutput(Satoshis(5000), P2WPKHWitnessSPKV0(dummyKey))),
+    UInt32.zero)
+
+  val dummyFundingInputs = Vector(
+    DLCFundingInputP2WPKHV0(dummyPrevTx,
+                            UInt32.zero,
+                            TransactionConstants.sequence),
+    DLCFundingInputP2WPKHV0(dummyPrevTx,
+                            UInt32.one,
+                            TransactionConstants.sequence)
+  )
+
+  lazy val sampleDLCOffer: DLCOffer = DLCOffer(
+    sampleOracleAndContractInfo,
+    dummyDLCKeys,
+    Satoshis(5000),
+    Vector(dummyFundingInputs.head),
+    dummyAddress,
+    SatoshisPerVirtualByte(Satoshis(3)),
+    dummyTimeouts
+  )
+
+  lazy val sampleMultiNonceDLCOffer: DLCOffer =
+    sampleDLCOffer.copy(oracleAndContractInfo = multiNonceOracleAndContractInfo)
+
+  lazy val sampleDLCParamHash: Sha256DigestBE =
+    DLCMessage.calcParamHash(sampleOracleInfo,
+                             sampleContractInfo,
+                             dummyTimeouts)
+
+  lazy val dummyOutcomeSigs: Vector[(DLCOutcomeType, ECAdaptorSignature)] =
+    Vector(EnumOutcome(winStr) -> ECAdaptorSignature.dummy,
+           EnumOutcome(loseStr) -> ECAdaptorSignature.dummy)
+
+  lazy val dummyCETSigs: CETSignatures =
+    CETSignatures(dummyOutcomeSigs, dummyPartialSig)
+
+  lazy val sampleDLCAccept: DLCAccept = DLCAccept(
+    Satoshis(5000),
+    dummyDLCKeys,
+    Vector(dummyFundingInputs.last),
+    dummyAddress,
+    dummyCETSigs,
+    sampleDLCOffer.tempContractId
+  )
+
+  lazy val dummyFundingSignatures: FundingSignatures = FundingSignatures(
+    Vector(
+      (TransactionOutPoint(dummyBlockHash, UInt32.zero), dummyScriptWitness)))
+
+  lazy val sampleDLCSign: DLCSign =
+    DLCSign(dummyCETSigs, dummyFundingSignatures, ByteVector.empty)
+
+  lazy val sampleDLCDb: DLCDb = DLCDb(
+    paramHash = sampleDLCParamHash,
+    tempContractId = sampleDLCOffer.tempContractId,
+    contractIdOpt = None,
+    state = DLCState.Offered,
+    isInitiator = true,
+    account = HDAccount.fromPath(BIP32Path.fromString("m/84'/0'/0'")).get,
+    keyIndex = 0,
+    oracleSigsOpt = Some(Vector(sampleOracleLoseSig)),
+    fundingOutPointOpt = None,
+    fundingTxIdOpt = None,
+    closingTxIdOpt = None,
+    outcomeOpt = None
+  )
+
+  def initDLC(
+      fundedWalletA: FundedDLCWallet,
+      fundedWalletB: FundedDLCWallet,
+      oracleAndContractInfo: OracleAndContractInfo)(implicit
+      ec: ExecutionContext): Future[
+    (InitializedDLCWallet, InitializedDLCWallet)] = {
+    val walletA = fundedWalletA.wallet
+    val walletB = fundedWalletB.wallet
+
+    for {
+      offer <- walletA.createDLCOffer(
+        oracleInfo = oracleAndContractInfo.oracleInfo,
+        contractInfo = oracleAndContractInfo.offerContractInfo,
+        collateral = Satoshis(5000),
+        feeRateOpt = None,
+        locktime = dummyTimeouts.contractMaturity.toUInt32,
+        refundLocktime = dummyTimeouts.contractTimeout.toUInt32
+      )
+      accept <- walletB.acceptDLCOffer(offer)
+      sigs <- walletA.signDLC(accept)
+      _ <- walletB.addDLCSigs(sigs)
+
+      tx <- walletB.broadcastDLCFundingTx(sigs.contractId)
+      _ <- walletA.processTransaction(tx, None)
+    } yield {
+      (InitializedDLCWallet(FundedDLCWallet(walletA)),
+       InitializedDLCWallet(FundedDLCWallet(walletB)))
+    }
+  }
+
+  case class InitializedDLCWallet(funded: FundedDLCWallet) {
+    val wallet: DLCWallet = funded.wallet
+  }
+
+  def getInitialOffer(wallet: DLCWallet)(implicit
+      ec: ExecutionContext): Future[DLCOfferDb] = {
+    wallet.dlcOfferDAO.findAll().map { all =>
+      require(all.size == 1, "There should only be one dlc initialized")
+      all.head
+    }
+  }
+
+  def getContractId(wallet: DLCWallet)(implicit
+      ec: ExecutionContext): Future[ByteVector] = {
+    wallet.dlcDAO.findAll().map { all =>
+      require(all.size == 1, "There should only be one dlc initialized")
+      all.head.contractIdOpt.get
+    }
+  }
+
+  def verifyInput(
+      transaction: Transaction,
+      inputIndex: Long,
+      prevOut: TransactionOutput): Boolean = {
+    val sigComponent = WitnessTxSigComponent(
+      transaction.asInstanceOf[WitnessTransaction],
+      UInt32(inputIndex),
+      prevOut,
+      Policy.standardFlags
+    )
+    ScriptInterpreter.runVerify(PreExecutionScriptProgram(sigComponent))
+  }
+
+  def dlcExecutionTest(
+      wallets: (InitializedDLCWallet, InitializedDLCWallet),
+      asInitiator: Boolean,
+      func: DLCWallet => Future[Transaction],
+      expectedOutputs: Int)(implicit ec: ExecutionContext): Future[Boolean] = {
+    val dlcA = wallets._1.wallet
+    val dlcB = wallets._2.wallet
+    dlcExecutionTest(dlcA, dlcB, asInitiator, func, expectedOutputs)
+  }
+
+  def dlcExecutionTest(
+      dlcA: DLCWallet,
+      dlcB: DLCWallet,
+      asInitiator: Boolean,
+      func: DLCWallet => Future[Transaction],
+      expectedOutputs: Int)(implicit ec: ExecutionContext): Future[Boolean] = {
+    for {
+      contractId <- getContractId(dlcA)
+      fundingTx <- dlcB.getDLCFundingTx(contractId)
+      tx <- if (asInitiator) func(dlcA) else func(dlcB)
+
+      _ <- {
+        if (asInitiator) dlcB.processTransaction(tx, None)
+        else dlcA.processTransaction(tx, None)
+      }
+
+      _ <- verifyProperlySetTxIds(dlcA)
+      _ <- verifyProperlySetTxIds(dlcB)
+    } yield {
+      assert(tx.inputs.size == 1)
+      assert(tx.outputs.size == expectedOutputs)
+      assert(ScriptInterpreter.checkTransaction(tx))
+      verifyInput(tx, 0, fundingTx.outputs.head)
+    }
+  }
+
+  def verifyProperlySetTxIds(wallet: DLCWallet)(implicit
+      ec: ExecutionContext): Future[Unit] = {
+    for {
+      contractId <- getContractId(wallet)
+      dlcDbOpt <- wallet.dlcDAO.findByContractId(contractId)
+    } yield {
+      dlcDbOpt match {
+        case None => fail()
+        case Some(dlcDb) =>
+          assert(dlcDb.fundingOutPointOpt.isDefined)
+          assert(dlcDb.closingTxIdOpt.isDefined)
+      }
+    }
+  }
+}
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/wallet/FundWalletUtil.scala b/testkit/src/main/scala/org/bitcoins/testkit/wallet/FundWalletUtil.scala
index f1854c495f..3e6ba6bb6f 100644
--- a/testkit/src/main/scala/org/bitcoins/testkit/wallet/FundWalletUtil.scala
+++ b/testkit/src/main/scala/org/bitcoins/testkit/wallet/FundWalletUtil.scala
@@ -9,10 +9,14 @@ import org.bitcoins.core.hd.HDAccount
 import org.bitcoins.core.protocol.BitcoinAddress
 import org.bitcoins.core.protocol.transaction.TransactionOutput
 import org.bitcoins.crypto.DoubleSha256DigestBE
+import org.bitcoins.dlc.wallet.DLCWallet
 import org.bitcoins.rpc.client.common.BitcoindRpcClient
 import org.bitcoins.server.BitcoinSAppConfig
 import org.bitcoins.testkit.util.TransactionTestUtil
-import org.bitcoins.testkit.wallet.FundWalletUtil.FundedWallet
+import org.bitcoins.testkit.wallet.FundWalletUtil.{
+  FundedTestWallet,
+  FundedWallet
+}
 import org.bitcoins.wallet.Wallet
 
 import scala.concurrent.{ExecutionContext, Future}
@@ -77,7 +81,7 @@ trait FundWalletUtil {
 
   /** Funds a bitcoin-s wallet with 3 utxos with 1, 2 and 3 bitcoin in the utxos */
   def fundWallet(wallet: Wallet)(implicit
-      ec: ExecutionContext): Future[FundedWallet] = {
+      ec: ExecutionContext): Future[FundedTestWallet] = {
 
     val defaultAccount = wallet.walletConfig.defaultAccount
     val fundedDefaultAccountWalletF = FundWalletUtil.fundAccountForWallet(
@@ -118,11 +122,29 @@ trait FundWalletUtil {
 
 object FundWalletUtil extends FundWalletUtil {
 
+  trait FundedTestWallet {
+    def wallet: Wallet
+  }
+
+  object FundedTestWallet {
+
+    def apply(wallet: Wallet): FundedTestWallet = {
+      wallet match {
+        case dlc: DLCWallet =>
+          FundedDLCWallet(dlc)
+        case _: Wallet =>
+          FundedWallet(wallet)
+      }
+    }
+  }
+
   /** This is a wallet that was two funded accounts
     * Account 0 (default account) has utxos of 1,2,3 bitcoin in it (6 btc total)
     * Account 1 has a utxos of 0.2,0.3,0.5 bitcoin in it (0.6 total)
     */
-  case class FundedWallet(wallet: Wallet)
+  case class FundedWallet(wallet: Wallet) extends FundedTestWallet
+
+  case class FundedDLCWallet(wallet: DLCWallet) extends FundedTestWallet
 
   /** This creates a wallet that was two funded accounts
     * Account 0 (default account) has utxos of 1,2,3 bitcoin in it (6 btc total)
@@ -144,6 +166,24 @@ object FundWalletUtil extends FundWalletUtil {
         bip39PasswordOpt = bip39PasswordOpt,
         extraConfig = extraConfig)
       funded <- FundWalletUtil.fundWallet(wallet)
-    } yield funded
+    } yield FundedWallet(funded.wallet)
+  }
+
+  def createFundedDLCWallet(
+      nodeApi: NodeApi,
+      chainQueryApi: ChainQueryApi,
+      bip39PasswordOpt: Option[String],
+      extraConfig: Option[Config] = None)(implicit
+      config: BitcoinSAppConfig,
+      system: ActorSystem): Future[FundedDLCWallet] = {
+    import system.dispatcher
+    for {
+      wallet <- BitcoinSWalletTest.createDLCWallet2Accounts(
+        nodeApi = nodeApi,
+        chainQueryApi = chainQueryApi,
+        bip39PasswordOpt = bip39PasswordOpt,
+        extraConfig = extraConfig)
+      funded <- FundWalletUtil.fundWallet(wallet)
+    } yield FundedDLCWallet(funded.wallet.asInstanceOf[DLCWallet])
   }
 }
diff --git a/wallet/src/main/scala/org/bitcoins/wallet/Wallet.scala b/wallet/src/main/scala/org/bitcoins/wallet/Wallet.scala
index 1ef01a5153..20cacaaa45 100644
--- a/wallet/src/main/scala/org/bitcoins/wallet/Wallet.scala
+++ b/wallet/src/main/scala/org/bitcoins/wallet/Wallet.scala
@@ -1,8 +1,8 @@
 package org.bitcoins.wallet
 
 import java.time.Instant
-
 import org.bitcoins.commons.jsonmodels.wallet.SyncHeightDescriptor
+import org.bitcoins.commons.jsonmodels.SerializedTransaction
 import org.bitcoins.core.api.chain.ChainQueryApi
 import org.bitcoins.core.api.feeprovider.FeeRateApi
 import org.bitcoins.core.api.node.NodeApi
@@ -43,6 +43,7 @@ import org.bitcoins.keymanager.bip39.{BIP39KeyManager, BIP39LockedKeyManager}
 import org.bitcoins.wallet.config.WalletAppConfig
 import org.bitcoins.wallet.internal._
 import org.bitcoins.wallet.models._
+import play.api.libs.json.Json
 import scodec.bits.ByteVector
 
 import scala.concurrent.{ExecutionContext, Future}
@@ -58,6 +59,9 @@ abstract class Wallet
     with RescanHandling
     with WalletLogger {
 
+  override def decodeRawTransaction(tx: Transaction): String =
+    Json.prettyPrint(SerializedTransaction.decodeRawTransaction(tx).toJson)
+
   override def keyManager: BIP39KeyManager
 
   implicit val ec: ExecutionContext
@@ -70,18 +74,18 @@ abstract class Wallet
 
   override val discoveryBatchSize: Int = walletConfig.discoveryBatchSize
 
-  private[wallet] val addressDAO: AddressDAO = AddressDAO()
-  private[wallet] val accountDAO: AccountDAO = AccountDAO()
-  private[wallet] val spendingInfoDAO: SpendingInfoDAO = SpendingInfoDAO()
-  private[wallet] val transactionDAO: TransactionDAO = TransactionDAO()
-  private[wallet] val scriptPubKeyDAO: ScriptPubKeyDAO = ScriptPubKeyDAO()
+  private[bitcoins] val addressDAO: AddressDAO = AddressDAO()
+  private[bitcoins] val accountDAO: AccountDAO = AccountDAO()
+  private[bitcoins] val spendingInfoDAO: SpendingInfoDAO = SpendingInfoDAO()
+  private[bitcoins] val transactionDAO: TransactionDAO = TransactionDAO()
+  private[bitcoins] val scriptPubKeyDAO: ScriptPubKeyDAO = ScriptPubKeyDAO()
 
-  private[wallet] val incomingTxDAO: IncomingTransactionDAO =
+  private[bitcoins] val incomingTxDAO: IncomingTransactionDAO =
     IncomingTransactionDAO()
 
-  private[wallet] val outgoingTxDAO: OutgoingTransactionDAO =
+  private[bitcoins] val outgoingTxDAO: OutgoingTransactionDAO =
     OutgoingTransactionDAO()
-  private[wallet] val addressTagDAO: AddressTagDAO = AddressTagDAO()
+  private[bitcoins] val addressTagDAO: AddressTagDAO = AddressTagDAO()
 
   private[wallet] val stateDescriptorDAO: WalletStateDescriptorDAO =
     WalletStateDescriptorDAO()
@@ -215,6 +219,7 @@ abstract class Wallet
   override def broadcastTransaction(transaction: Transaction): Future[Unit] =
     for {
       _ <- nodeApi.broadcastTransaction(transaction)
+      _ <- processTransaction(transaction, blockHashOpt = None)
       _ <- walletCallbacks.executeOnTransactionBroadcast(logger, transaction)
     } yield ()
 
@@ -752,14 +757,14 @@ abstract class Wallet
 object Wallet extends WalletLogger {
 
   private case class WalletImpl(
-      override val keyManager: BIP39KeyManager,
-      override val nodeApi: NodeApi,
-      override val chainQueryApi: ChainQueryApi,
-      override val feeRateApi: FeeRateApi,
+      keyManager: BIP39KeyManager,
+      nodeApi: NodeApi,
+      chainQueryApi: ChainQueryApi,
+      feeRateApi: FeeRateApi,
       override val creationTime: Instant
   )(implicit
-      override val walletConfig: WalletAppConfig,
-      override val ec: ExecutionContext
+      val walletConfig: WalletAppConfig,
+      val ec: ExecutionContext
   ) extends Wallet
 
   def apply(
diff --git a/wallet/src/main/scala/org/bitcoins/wallet/config/WalletAppConfig.scala b/wallet/src/main/scala/org/bitcoins/wallet/config/WalletAppConfig.scala
index 7cef65745d..7bd1244a12 100644
--- a/wallet/src/main/scala/org/bitcoins/wallet/config/WalletAppConfig.scala
+++ b/wallet/src/main/scala/org/bitcoins/wallet/config/WalletAppConfig.scala
@@ -168,7 +168,7 @@ case class WalletAppConfig(
     *  2. wallet exists
     *  3. The account exists
     */
-  private def hasWallet()(implicit
+  def hasWallet()(implicit
       walletConf: WalletAppConfig,
       ec: ExecutionContext): Future[Boolean] = {
     if (kmConf.seedExists()) {
diff --git a/wallet/src/main/scala/org/bitcoins/wallet/internal/FundTransactionHandling.scala b/wallet/src/main/scala/org/bitcoins/wallet/internal/FundTransactionHandling.scala
index af9f6b6c49..9aa69f6512 100644
--- a/wallet/src/main/scala/org/bitcoins/wallet/internal/FundTransactionHandling.scala
+++ b/wallet/src/main/scala/org/bitcoins/wallet/internal/FundTransactionHandling.scala
@@ -49,7 +49,7 @@ trait FundTransactionHandling extends WalletLogger { self: Wallet =>
     *
     * Utxos are funded with the given coin selection algorithm
     */
-  private[wallet] def fundRawTransactionInternal(
+  private[bitcoins] def fundRawTransactionInternal(
       destinations: Vector[TransactionOutput],
       feeRate: FeeUnit,
       fromAccount: AccountDb,
diff --git a/wallet/src/main/scala/org/bitcoins/wallet/models/TransactionDAO.scala b/wallet/src/main/scala/org/bitcoins/wallet/models/TransactionDAO.scala
index 21b66be39f..3f89e988b3 100644
--- a/wallet/src/main/scala/org/bitcoins/wallet/models/TransactionDAO.scala
+++ b/wallet/src/main/scala/org/bitcoins/wallet/models/TransactionDAO.scala
@@ -40,7 +40,7 @@ trait TxDAO[DbEntryType <: TxDB]
   override def createAll(ts: Vector[DbEntryType]): Future[Vector[DbEntryType]] =
     createAllNoAutoInc(ts, safeDatabase)
 
-  override protected def findByPrimaryKeys(
+  override def findByPrimaryKeys(
       txIdBEs: Vector[DoubleSha256DigestBE]): Query[DbTable, DbEntryType, Seq] =
     table.filter(_.txIdBE.inSet(txIdBEs))
 
@@ -83,6 +83,11 @@ trait TxDAO[DbEntryType <: TxDB]
 
   def findByTxId(txId: DoubleSha256Digest): Future[Option[DbEntryType]] =
     findByTxId(txId.flip)
+
+  def findByTxIdBEs(
+      txIdBEs: Vector[DoubleSha256DigestBE]): Future[Vector[DbEntryType]] = {
+    database.run(findByPrimaryKeys(txIdBEs).result).map(_.toVector)
+  }
 }
 
 case class TransactionDAO()(implicit
@@ -131,6 +136,5 @@ case class TransactionDAO()(implicit
 
     def primaryKey: PrimaryKey =
       primaryKey("pk_tx", sourceColumns = txIdBE)
-
   }
 }