@tradelayerprotocol/tradelayer 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/.claude/settings.local.json +13 -0
  2. package/.claude/skills/tl-algo/SKILL.md +255 -0
  3. package/.gitattributes +2 -0
  4. package/.github/workflows/publish.yaml +26 -0
  5. package/4mm.js +163 -0
  6. package/LICENSE +21 -0
  7. package/NPMSwapRefactor.zip +0 -0
  8. package/README.md +217 -0
  9. package/address.sh +26 -0
  10. package/algoAPI.js +581 -0
  11. package/analyzepsbt.js +92 -0
  12. package/apiEx.js +99 -0
  13. package/bb_hyperscalper.js +290 -0
  14. package/bbo_demo.js +111 -0
  15. package/buyer.js +622 -0
  16. package/client.js +50 -0
  17. package/createTxTest.js +26 -0
  18. package/createWallet.js +75 -0
  19. package/daytrader.js +531 -0
  20. package/decodeTest.js +69 -0
  21. package/fundingManager.js +144 -0
  22. package/index.js +4 -0
  23. package/listener.js +27 -0
  24. package/litecoreTxBuilder.js +1128 -0
  25. package/mmEx.js +356 -0
  26. package/networks.js +51 -0
  27. package/orderbook.js +200 -0
  28. package/package.json +34 -0
  29. package/perTradeQueue.js +36 -0
  30. package/projectsTLNPMTLNPM/package-lock.json +162 -0
  31. package/projectsTLNPMTLNPM/package.json +5 -0
  32. package/quick.js +32 -0
  33. package/quickFut.js +37 -0
  34. package/quickSell.js +37 -0
  35. package/relayerClient.js +117 -0
  36. package/run4mm.js +80 -0
  37. package/run_bbo_tracker.js +241 -0
  38. package/seller.js +443 -0
  39. package/session.js +45 -0
  40. package/setup-lin-ltc.sh +139 -0
  41. package/setup-lin.sh +203 -0
  42. package/setup-win-ltc.bat +108 -0
  43. package/setup-win.bat +167 -0
  44. package/spam_screamer_futures.js +222 -0
  45. package/tradelayer.js/.gitattributes +2 -0
  46. package/tradelayer.js/README.md +2 -0
  47. package/tradelayer.js/oldTests/activationTest.js +6 -0
  48. package/tradelayer.js/oldTests/base58.test.js +23 -0
  49. package/tradelayer.js/oldTests/base64Decode.test.js +16 -0
  50. package/tradelayer.js/oldTests/blocksRefactor.js +140 -0
  51. package/tradelayer.js/oldTests/checkVestBalance.js +25 -0
  52. package/tradelayer.js/oldTests/consensusHashProto.js +151 -0
  53. package/tradelayer.js/oldTests/contractOrderbook.js +243 -0
  54. package/tradelayer.js/oldTests/createPayload.js +0 -0
  55. package/tradelayer.js/oldTests/createTestnetAddr.js +43 -0
  56. package/tradelayer.js/oldTests/decode.js +205 -0
  57. package/tradelayer.js/oldTests/decodeTest.js +50 -0
  58. package/tradelayer.js/oldTests/displayTallyMap.js +19 -0
  59. package/tradelayer.js/oldTests/encodeDecode.js +340 -0
  60. package/tradelayer.js/oldTests/expressTest.js +29 -0
  61. package/tradelayer.js/oldTests/extractBlocksVanilla.js +214 -0
  62. package/tradelayer.js/oldTests/extractBlocksVanillaa.js +179 -0
  63. package/tradelayer.js/oldTests/extractPubkeyTest.js +60 -0
  64. package/tradelayer.js/oldTests/fillInputCacheProto.js +111 -0
  65. package/tradelayer.js/oldTests/getRawTxTest.js +22 -0
  66. package/tradelayer.js/oldTests/indexTest.js +26 -0
  67. package/tradelayer.js/oldTests/initTokensTest.js +32 -0
  68. package/tradelayer.js/oldTests/interfaceChild.js +129 -0
  69. package/tradelayer.js/oldTests/listenerChild.js +112 -0
  70. package/tradelayer.js/oldTests/opdecode.js +26 -0
  71. package/tradelayer.js/oldTests/options.js +79 -0
  72. package/tradelayer.js/oldTests/optxtest.js +116 -0
  73. package/tradelayer.js/oldTests/optxtest1.js +64 -0
  74. package/tradelayer.js/oldTests/oracle.test.js +32 -0
  75. package/tradelayer.js/oldTests/orderbook.test.js +36 -0
  76. package/tradelayer.js/oldTests/parsing.js +93 -0
  77. package/tradelayer.js/oldTests/payload.js +13 -0
  78. package/tradelayer.js/oldTests/persistenceUnitTest.js +23 -0
  79. package/tradelayer.js/oldTests/property.test.js +53 -0
  80. package/tradelayer.js/oldTests/propertyLevel.js +75 -0
  81. package/tradelayer.js/oldTests/propertyTest.js +32 -0
  82. package/tradelayer.js/oldTests/queryAddressTest.js +17 -0
  83. package/tradelayer.js/oldTests/salter.js +14 -0
  84. package/tradelayer.js/oldTests/tally.js +81 -0
  85. package/tradelayer.js/oldTests/tally.test.js +48 -0
  86. package/tradelayer.js/oldTests/tally2.js +124 -0
  87. package/tradelayer.js/oldTests/tally3.js +142 -0
  88. package/tradelayer.js/oldTests/tallyDiag.js +38 -0
  89. package/tradelayer.js/oldTests/testGetRaw.js +40 -0
  90. package/tradelayer.js/oldTests/testHexConvert.js +47 -0
  91. package/tradelayer.js/oldTests/testNewEncoding.js +96 -0
  92. package/tradelayer.js/oldTests/testNewEncoding2.js +113 -0
  93. package/tradelayer.js/oldTests/testNewEncoding3 +112 -0
  94. package/tradelayer.js/oldTests/testNewEncoding3.js +168 -0
  95. package/tradelayer.js/oldTests/testOPReturn.js +102 -0
  96. package/tradelayer.js/oldTests/testPayload.js +23 -0
  97. package/tradelayer.js/oldTests/testRaw.js +50 -0
  98. package/tradelayer.js/oldTests/testSendTooMuch.js +20 -0
  99. package/tradelayer.js/oldTests/testTxBuild +28 -0
  100. package/tradelayer.js/oldTests/testTxBuild.js +42 -0
  101. package/tradelayer.js/oldTests/tokenOrderbook.js +243 -0
  102. package/tradelayer.js/oldTests/txUtilsA.js +515 -0
  103. package/tradelayer.js/oldTests/validityUnitTest.js +53 -0
  104. package/tradelayer.js/oldTests/vaults.js +72 -0
  105. package/tradelayer.js/oldTests/volumeIndex.js +117 -0
  106. package/tradelayer.js/oldTests/volumeIndex2.js +88 -0
  107. package/tradelayer.js/output_base64.txt +1 -0
  108. package/tradelayer.js/package-lock.json +9967 -0
  109. package/tradelayer.js/package.json +61 -0
  110. package/tradelayer.js/server/index.js +88 -0
  111. package/tradelayer.js/server/litecoind.exe +0 -0
  112. package/tradelayer.js/src/activation.js +303 -0
  113. package/tradelayer.js/src/adjuster.js +77 -0
  114. package/tradelayer.js/src/amm.js +400 -0
  115. package/tradelayer.js/src/base256.js +55 -0
  116. package/tradelayer.js/src/base94.js +79 -0
  117. package/tradelayer.js/src/channels.js +1163 -0
  118. package/tradelayer.js/src/clearing.js +3109 -0
  119. package/tradelayer.js/src/clearlist.js +364 -0
  120. package/tradelayer.js/src/client.js +295 -0
  121. package/tradelayer.js/src/consensus.js +613 -0
  122. package/tradelayer.js/src/contractRegistry.js +964 -0
  123. package/tradelayer.js/src/db.js +89 -0
  124. package/tradelayer.js/src/init.js +24 -0
  125. package/tradelayer.js/src/insurance.js +347 -0
  126. package/tradelayer.js/src/interface.js +218 -0
  127. package/tradelayer.js/src/interfaceExpress.js +178 -0
  128. package/tradelayer.js/src/iou.js +509 -0
  129. package/tradelayer.js/src/listener.js +226 -0
  130. package/tradelayer.js/src/logic.js +1702 -0
  131. package/tradelayer.js/src/main.js +927 -0
  132. package/tradelayer.js/src/marginMap.js +2165 -0
  133. package/tradelayer.js/src/options.js +126 -0
  134. package/tradelayer.js/src/oracle.js +394 -0
  135. package/tradelayer.js/src/orderbook.js +4123 -0
  136. package/tradelayer.js/src/persistence.js +554 -0
  137. package/tradelayer.js/src/property.js +411 -0
  138. package/tradelayer.js/src/reOrg.js +41 -0
  139. package/tradelayer.js/src/scaling.js +145 -0
  140. package/tradelayer.js/src/tally.js +1275 -0
  141. package/tradelayer.js/src/tradeHistoryManager.js +552 -0
  142. package/tradelayer.js/src/txDecoder.js +584 -0
  143. package/tradelayer.js/src/txEncoder.js +610 -0
  144. package/tradelayer.js/src/txIndex.js +502 -0
  145. package/tradelayer.js/src/txUtils.js +1392 -0
  146. package/tradelayer.js/src/types.js +429 -0
  147. package/tradelayer.js/src/validity.js +3077 -0
  148. package/tradelayer.js/src/vaults.js +430 -0
  149. package/tradelayer.js/src/vesting.js +491 -0
  150. package/tradelayer.js/src/volumeIndex.js +618 -0
  151. package/tradelayer.js/src/walletInterface.js +220 -0
  152. package/tradelayer.js/src/walletListener.js +665 -0
  153. package/tradelayer.js/tests/256decode.js +82 -0
  154. package/tradelayer.js/tests/UTXOracle.js +205 -0
  155. package/tradelayer.js/tests/base94test.js +23 -0
  156. package/tradelayer.js/tests/cancelTxTest.js +62 -0
  157. package/tradelayer.js/tests/contractInterfaceTest.js +48 -0
  158. package/tradelayer.js/tests/decimalTest.js +65 -0
  159. package/tradelayer.js/tests/decoderTest.js +100 -0
  160. package/tradelayer.js/tests/deltaCount.js +47 -0
  161. package/tradelayer.js/tests/deltaCount2.js +60 -0
  162. package/tradelayer.js/tests/interfaceTest.js +37 -0
  163. package/tradelayer.js/tests/mainTest.js +53 -0
  164. package/tradelayer.js/tests/makeActivationTest.js +24 -0
  165. package/tradelayer.js/tests/maxHeightTest.js +49 -0
  166. package/tradelayer.js/tests/reverseHash.js +72 -0
  167. package/tradelayer.js/tests/sensitiveConsoleOutput.txt +267 -0
  168. package/tradelayer.js/tests/tallyTest.js +40 -0
  169. package/tradelayer.js/tests/testBuybacks.js +46 -0
  170. package/tradelayer.js/tests/testCodeHash.js +49 -0
  171. package/tradelayer.js/tests/testConsensusHash.js +91 -0
  172. package/tradelayer.js/tests/testDecode.js +30 -0
  173. package/tradelayer.js/tests/testEncodingLengths.js +129 -0
  174. package/tradelayer.js/tests/testGetTx +32 -0
  175. package/tradelayer.js/tests/testGetTx.js +32 -0
  176. package/tradelayer.js/tests/testHexHash.js +32 -0
  177. package/tradelayer.js/tests/testIndexHash.js +35 -0
  178. package/tradelayer.js/tests/testInitContracts.js +38 -0
  179. package/tradelayer.js/tests/testMaxConsensus.js +12 -0
  180. package/tradelayer.js/tests/testMaxSynth.js +44 -0
  181. package/tradelayer.js/tests/testMint.js +21 -0
  182. package/tradelayer.js/tests/testNetwork.js +33 -0
  183. package/tradelayer.js/tests/testOrderbookLoad.js +62 -0
  184. package/tradelayer.js/tests/testRebates.js +32 -0
  185. package/tradelayer.js/tests/testRedeem.js +22 -0
  186. package/tradelayer.js/tests/testTokenTrade.js +39 -0
  187. package/tradelayer.js/tests/testTxBuild.js +42 -0
  188. package/tradelayer.js/tests/testUTXOTrade.js +27 -0
  189. package/tradelayer.js/tests/tokenTradeHistory.js +27 -0
  190. package/tradelayer.js/tests/tradeFutures.js +40 -0
  191. package/tradelayer.js/tests/tradeHistoryExample.js +35 -0
  192. package/tradelayer.js/tests/tradeHistoryLoad.js +15 -0
  193. package/tradelayer.js/tests/txScanTest.js +134 -0
  194. package/tradelayer.js/tests/validateTest.js +136 -0
  195. package/tradelayer.js/tests/vestingTest.js +37 -0
  196. package/tradelayer.js/utils/activateMainnet.js +59 -0
  197. package/tradelayer.js/utils/activateMainnetDoge.js +63 -0
  198. package/tradelayer.js/utils/autocompactdb.js +23 -0
  199. package/tradelayer.js/utils/base64toHex.js +32 -0
  200. package/tradelayer.js/utils/broadcastDoge.js +38 -0
  201. package/tradelayer.js/utils/calcRedeem.js +19 -0
  202. package/tradelayer.js/utils/checkNetwork.js +27 -0
  203. package/tradelayer.js/utils/createAddress.js +48 -0
  204. package/tradelayer.js/utils/createAttestation.js +133 -0
  205. package/tradelayer.js/utils/createContract.js +118 -0
  206. package/tradelayer.js/utils/createOracle.js +94 -0
  207. package/tradelayer.js/utils/createwallet.js +20 -0
  208. package/tradelayer.js/utils/crossFuturesTrades.js +57 -0
  209. package/tradelayer.js/utils/crossTokenTrades.js +62 -0
  210. package/tradelayer.js/utils/dumpPriv.js +29 -0
  211. package/tradelayer.js/utils/generateChannel.js +34 -0
  212. package/tradelayer.js/utils/getInfo.js +21 -0
  213. package/tradelayer.js/utils/hardWipe.js +20 -0
  214. package/tradelayer.js/utils/hexTo64.js +16 -0
  215. package/tradelayer.js/utils/importAddress.js +28 -0
  216. package/tradelayer.js/utils/importpriv.js +20 -0
  217. package/tradelayer.js/utils/issueOracleContract.js +67 -0
  218. package/tradelayer.js/utils/issueTokens.js +41 -0
  219. package/tradelayer.js/utils/listunspent.js +66 -0
  220. package/tradelayer.js/utils/litecoinClient.js +30 -0
  221. package/tradelayer.js/utils/loadwallet.js +20 -0
  222. package/tradelayer.js/utils/publishOracle.js +113 -0
  223. package/tradelayer.js/utils/sendActivation.js +21 -0
  224. package/tradelayer.js/utils/sendChannelContractTrade.js +34 -0
  225. package/tradelayer.js/utils/sendChannelTokenTrade.js +34 -0
  226. package/tradelayer.js/utils/sendCommit.js +24 -0
  227. package/tradelayer.js/utils/sendDoge.js +62 -0
  228. package/tradelayer.js/utils/sendDogeMain.js +67 -0
  229. package/tradelayer.js/utils/sendDogeTx.js +46 -0
  230. package/tradelayer.js/utils/sendLTC.js +63 -0
  231. package/tradelayer.js/utils/sendMainnet.js +62 -0
  232. package/tradelayer.js/utils/sendTransfer.js +19 -0
  233. package/tradelayer.js/utils/sendVestTest.js +88 -0
  234. package/tradelayer.js/utils/sendWithdrawal.js +26 -0
  235. package/tradelayer.js/utils/simpleStart.js +8 -0
  236. package/tradelayer.js/utils/startStop.js +27 -0
  237. package/tradelayer.js/utils/structuredTrades.js +136 -0
  238. package/tradelayer.js/utils/verifySignature.js +90 -0
  239. package/tradelayer.js/utils/verifyWitnessAndScriptPubkey.js +41 -0
  240. package/tradelayer.js/utils/walletCache.js +172 -0
  241. package/tradelayer.js/utils/walletContractInterface.js +48 -0
  242. package/tradelayer.js/utils/walletFetchTxs.js +66 -0
  243. package/tradelayer.js/utils/walletUtils.js +97 -0
  244. package/tradelayer.js/utils/wipeDB.js +55 -0
  245. package/tradelayer.js/utils/wipeDBNotTx.js +50 -0
  246. package/txEncoder.js +529 -0
  247. package/utility.js +28 -0
  248. package/verifymessage.js +38 -0
  249. package/ws-transport.js +311 -0
@@ -0,0 +1,243 @@
1
+ const BigNumber = require('bignumber.js');
2
+ const level = require('level');
3
+
4
+ class TokenOrderbook {
5
+ constructor(dbPath, tickSize = new BigNumber('0.000000001')) {
6
+ this.tickSize = tickSize;
7
+ this.db = level(dbPath);
8
+ this.orderBooks = {}; // This will be populated from LevelDB
9
+ this.loadOrderBooks(); // Load existing order books from LevelDB
10
+ }
11
+
12
+ async loadOrderBooks() {
13
+ // Load order books from LevelDB
14
+ for await (const [key, value] of this.db.iterator({ gt: 'book-', lt: 'book-\xFF' })) {
15
+ this.orderBooks[key.split('-')[1]] = JSON.parse(value);
16
+ }
17
+ }
18
+
19
+ async saveOrderBook(pair) {
20
+ // Save order book to LevelDB
21
+ await this.db.put(`book-${pair}`, JSON.stringify(this.orderBooks[pair]));
22
+ }
23
+
24
+ // Adds a token order to the order book
25
+ addTokenOrder({ propertyIdNumber, propertyIdNumberDesired, amountOffered, amountExpected, time }) {
26
+ const price = this.calculatePrice(amountOffered, amountExpected);
27
+ const order = { propertyIdNumber, propertyIdNumberDesired, amountOffered, amountExpected, price, time };
28
+
29
+ const orderBookKey = `${propertyIdNumber}-${propertyIdNumberDesired}`;
30
+ this.insertOrder(order, orderBookKey);
31
+ this.matchOrders(orderBookKey);
32
+ }
33
+
34
+ addContractOrder({ contractId, amount, price, time, sell }) {
35
+ // Create a contract order object with the sell parameter
36
+ const contractOrder = { contractId, amount, price, time, sell };
37
+
38
+ // The orderBookKey is based on the contractId since it's a derivative contract
39
+ const orderBookKey = `contract-${contractId}`;
40
+
41
+ // Insert the contract order into the order book
42
+ this.insertOrder(contractOrder, orderBookKey, true);
43
+
44
+ // Match orders in the derivative contract order book
45
+ this.matchOrders(orderBookKey);
46
+ }
47
+
48
+ insertOrder(order, orderBookKey, isContractOrder = false) {
49
+ // If order book does not exist, create it
50
+ if (!this.orderBooks[orderBookKey]) {
51
+ this.orderBooks[orderBookKey] = { buy: [], sell: [] };
52
+ }
53
+
54
+ // Determine if it's a buy or sell order based on the property IDs
55
+ if(isContractOrder==false){
56
+ const side = order.propertyIdNumber < order.propertyIdNumberDesired ? 'buy' : 'sell';
57
+ }else if(isContractOrder==true&&sell==true){
58
+ const side = 'sell';
59
+ }else if(isContractOrder==true&&sell==false){
60
+ const side = 'buy'
61
+ }
62
+ // Insert the order into the correct side of the book
63
+ const bookSide = this.orderBooks[orderBookKey][side];
64
+ const index = bookSide.findIndex((o) => o.time > order.time);
65
+ if (index === -1) {
66
+ bookSide.push(order);
67
+ } else {
68
+ bookSide.splice(index, 0, order);
69
+ }
70
+
71
+ // Save the updated order book
72
+ this.saveOrderBook(orderBookKey);
73
+ }
74
+
75
+ calculatePrice(amountOffered, amountExpected) {
76
+ const priceRatio = new BigNumber(amountOffered).dividedBy(amountExpected);
77
+ return priceRatio.decimalPlaces(8, BigNumber.ROUND_HALF_UP);
78
+ }
79
+
80
+ matchOrders(orderBookKey, isContract = false) {
81
+ const orderBook = this.orderBooks[orderBookKey];
82
+ if (!orderBook || orderBook.buy.length === 0 || orderBook.sell.length === 0) {
83
+ return; // Nothing to match
84
+ }
85
+
86
+ const matches = [];
87
+
88
+ // Sort buy orders from highest to lowest price and sell orders from lowest to highest price
89
+ orderBook.buy.sort((a, b) => b.price.comparedTo(a.price) || a.time - b.time); // Highest price and oldest first
90
+ orderBook.sell.sort((a, b) => a.price.comparedTo(b.price) || a.time - b.time); // Lowest price and oldest first
91
+
92
+ // While there is still potential for matches
93
+ while (orderBook.sell.length > 0 && orderBook.buy.length > 0 &&
94
+ orderBook.sell[0].price.lte(orderBook.buy[0].price)) {
95
+
96
+ // Match the top of the buy and sell orders
97
+ let sellOrder = orderBook.sell[0];
98
+ let buyOrder = orderBook.buy[0];
99
+
100
+ // Determine the amount to trade which is the minimum of the two orders
101
+ const amountToTrade = BigNumber.minimum(sellOrder.amountOffered, buyOrder.amountExpected);
102
+
103
+ // Update orders
104
+ sellOrder.amountOffered = sellOrder.amountOffered.minus(amountToTrade);
105
+ buyOrder.amountExpected = buyOrder.amountExpected.minus(amountToTrade);
106
+
107
+ // Deduct taker fee from buyer and give maker rebate to seller
108
+ if(isContract==false){
109
+ const takerFee = amountToTrade.times(0.0002);
110
+ const makerRebate = takerFee.div(2);
111
+ }
112
+
113
+ if(isContract==true){
114
+ const takerFee = amountToTrade.times(0.0001);
115
+ const makerRebate = takerFee.div(2);
116
+ }
117
+ buyOrder.amountExpected = buyOrder.amountExpected.minus(takerFee);
118
+ sellOrder.amountOffered = sellOrder.amountOffered.plus(makerRebate);
119
+
120
+ // If an order is completely filled, remove it from the order book
121
+ if (sellOrder.amountOffered.isZero()) {
122
+ orderBook.sell.shift(); // Remove the sell order
123
+ }
124
+ if (buyOrder.amountExpected.isZero()) {
125
+ orderBook.buy.shift(); // Remove the buy order
126
+ }
127
+
128
+ const matchedOrderDetails = {
129
+ sellOrderId: sellOrder.id, // Assuming we have unique IDs for orders
130
+ buyOrderId: buyOrder.id,
131
+ amountToTrade: amountToTrade.toString(),
132
+ price: sellOrder.price.toString(),
133
+ takerFee: takerFee.toString(),
134
+ makerRebate: makerRebate.toString()
135
+ };
136
+
137
+ matches.push(matchedOrderDetails);
138
+
139
+ // Partial matches: remaining amounts stay in the order book
140
+ // (They are already updated in the order objects)
141
+ }// Process the matches differently based on whether they're token or contract matches
142
+
143
+ const matchResults = {
144
+ orderBook: this.orderBooks[orderBookKey],
145
+ matches
146
+ };
147
+
148
+ if (isContract) {
149
+ this.processContractMatches(matchResults.matches);
150
+ } else {
151
+ this.processTokenMatches(matchResults.matches);
152
+ }
153
+
154
+ this.saveOrderBook(orderBookKey);
155
+
156
+ // Return the updated order book and the matches
157
+ return {
158
+ orderBook: this.orderBooks[orderBookKey],
159
+ matches
160
+ };
161
+ }
162
+
163
+
164
+ processTokenMatches(matches) {
165
+ matches.forEach(match => {
166
+ const sellOrder = this.getAddressBalances(match.sellOrderId);
167
+ const buyOrder = this.getAddressBalances(match.buyOrderId);
168
+
169
+ // Debit the reserve balances from the seller and buyer
170
+ sellOrder.reserveAmount = sellOrder.reserveAmount.minus(match.amountToTrade);
171
+ buyOrder.reserveAmount = buyOrder.reserveAmount.minus(match.amountToTrade);
172
+
173
+ // Credit the available balances to the buyer and seller
174
+ sellOrder.available = sellOrder.available.plus(match.amountToTrade);
175
+ buyOrder.available = buyOrder.available.plus(match.amountToTrade);
176
+
177
+ // Apply fees and rebates
178
+ buyOrder.available = buyOrder.available.minus(match.takerFee);
179
+ sellOrder.available = sellOrder.available.plus(match.makerRebate);
180
+
181
+ // Save the updated balances back to the TallyMap
182
+ this.updateBalance(match.sellOrderId, sellOrder);
183
+ this.updateBalance(match.buyOrderId, buyOrder);
184
+ });
185
+ }
186
+
187
+ processContractMatches(matches) {
188
+ matches.forEach(match => {
189
+ // Logic for identifying and updating the marginMap for contracts
190
+ // You can go to negative balances for contracts, so the logic here
191
+ // will need to be different than for tokens.
192
+
193
+ // Example logic (you'll need to replace this with your actual logic):
194
+ const contract = this.marginMap.get(match.contractId);
195
+ if (match.sell) {
196
+ // Update seller's margin balance
197
+ contract.sellerMargin = contract.sellerMargin.minus(match.amountToTrade);
198
+ // Update buyer's balance (can go negative)
199
+ contract.buyerMargin = contract.buyerMargin.plus(match.amountToTrade.minus(match.takerFee));
200
+ } else {
201
+ // Update buyer's margin balance
202
+ contract.buyerMargin = contract.buyerMargin.minus(match.amountToTrade);
203
+ // Update seller's balance (can go negative)
204
+ contract.sellerMargin = contract.sellerMargin.plus(match.amountToTrade.plus(match.makerRebate));
205
+ }
206
+
207
+ // Save the updated contract margins back to the marginMap
208
+ this.marginMap.set(match.contractId, contract);
209
+ });
210
+ }
211
+
212
+ async processContractMatches(matches, currentBlockHeight) {
213
+ for (const match of matches) {
214
+ try {
215
+ // Load the margin map for the given series ID and block height
216
+ const marginMap = await MarginMap.loadMarginMap(match.contractSeriesId, currentBlockHeight);
217
+
218
+ // Update contract balances for the buyer and seller
219
+ marginMap.updateContractBalances(match.buyerAddress, match.amount, match.price, true);
220
+ marginMap.updateContractBalances(match.sellerAddress, match.amount, match.price, false);
221
+ marginMap.updateMargin(match.buyerAddress, match.amount, match.price);
222
+ marginMap.updateMargin(match.sellerAddress, -match.amount, match.price);
223
+
224
+ // Realize PnL for the buyer and seller
225
+ const buyerPnl = marginMap.realizePnl(match.buyerAddress, match.amount, match.price, match.buyerAvgPrice);
226
+ const sellerPnl = marginMap.realizePnl(match.sellerAddress, -match.amount, match.price, match.sellerAvgPrice);
227
+
228
+ // Save the updated margin map
229
+ await marginMap.saveMarginMap(currentBlockHeight);
230
+
231
+ // Optionally handle the PnL if needed, e.g., logging or further processing
232
+ // ...
233
+
234
+ } catch (error) {
235
+ console.error(`Error processing contract match ${match.id}:`, error);
236
+ // Handle error, potentially rolling back any partial updates or retrying
237
+ }
238
+ }
239
+ }
240
+ }
241
+
242
+
243
+ module.exports = TokenOrderbook;