@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,430 @@
1
+ const db = require('./db.js');
2
+ const PropertyManager = require('./property.js');
3
+ const ContractsRegistry = require('./contractRegistry.js');
4
+ const MarginMap = require('./marginMap');
5
+ const BigNumber = require('bignumber.js')
6
+
7
+ class SynthRegistry {
8
+ static vaults;
9
+ static syntheticTokens;
10
+ static nextVaultId = 1;
11
+
12
+ // Ensure the maps are initialized
13
+ static async initializeIfNeeded() {
14
+ if (!this.vaults || !this.syntheticTokens) {
15
+ console.log('initializing vaults and synth reg.')
16
+ this.vaults = new Map();
17
+ this.syntheticTokens = new Map();
18
+ await this.loadFromDatabase(); // Load data from the database
19
+ }
20
+ }
21
+
22
+ // Create a new vault for a synthetic token
23
+ static async createVault(propertyId, contractId) {
24
+ await this.initializeIfNeeded();
25
+ //console.log('creating vault')
26
+ const vaultId = `s-${propertyId}-${contractId}`
27
+ this.vaults.set(vaultId, {propertyId, contractId, contracts:0, margin:0, available:0, outstanding:0});
28
+ await this.saveVault(vaultId);
29
+ return vaultId;
30
+ }
31
+
32
+ static async getTotalBalanceForProperty(propertyId) {
33
+ await this.initializeIfNeeded();
34
+
35
+ let total = BigNumber(0);
36
+
37
+ for (const [vaultId, vault] of this.vaults.entries()) {
38
+ const parts = vaultId.split("-");
39
+ if (parts.length < 3) continue; // sanity check
40
+ const pid = parseInt(parts[1]); // propertyId is first number
41
+ if (pid !== propertyId) continue;
42
+
43
+ // Count margin + available as locked collateral
44
+ const vaultBal = BigNumber(vault.margin || 0).plus(vault.available || 0);
45
+ total = total.plus(vaultBal);
46
+ }
47
+
48
+ return total.decimalPlaces(8);
49
+ }
50
+
51
+ static async getTotalOutstandingForProperty(propertyId) {
52
+ await this.initializeIfNeeded();
53
+
54
+ let total = BigNumber(0);
55
+ const isStringId = typeof propertyId === "string" && propertyId.startsWith("s-");
56
+
57
+ for (const [vaultId, vault] of this.vaults.entries()) {
58
+ const parts = vaultId.split("-");
59
+ if (parts.length < 3) continue;
60
+
61
+ if (isStringId) {
62
+ // Direct match (e.g. propertyId = "s-1-1")
63
+ if (vaultId !== propertyId) continue;
64
+ } else {
65
+ // Numeric match on collateral ID (e.g. propertyId = 1)
66
+ const pid = parseInt(parts[1], 10);
67
+ if (pid !== propertyId) continue;
68
+ }
69
+
70
+ total = total.plus(vault.outstanding || 0);
71
+ }
72
+
73
+ return total.decimalPlaces(8);
74
+ }
75
+
76
+
77
+
78
+ // Update the amount in a vault
79
+ static async updateVault(vaultId, contractsAndMargin, amount, grossRequired) {
80
+ await this.initializeIfNeeded();
81
+
82
+ let vault = this.vaults.get(vaultId);
83
+
84
+ // auto-create if missing
85
+ if (!vault) {
86
+ vault = {
87
+ contracts: 0,
88
+ margin: 0,
89
+ available: 0,
90
+ outstanding: 0,
91
+ };
92
+ console.log(`Creating new vault ${vaultId}`);
93
+ }
94
+
95
+ vault.contracts += contractsAndMargin.contracts || 0;
96
+ vault.margin += contractsAndMargin.margin || 0;
97
+ vault.available += grossRequired || 0;
98
+ vault.outstanding += amount || 0;
99
+
100
+ this.vaults.set(vaultId, vault);
101
+ await this.saveVault(vaultId, vault);
102
+ }
103
+
104
+ // Update the amount in a vault
105
+ static async updateVaultRedeem(vaultId, contractsAndMargin,amount) {
106
+ await this.initializeIfNeeded();
107
+ const vault = this.vaults.get(vaultId);
108
+ if (!vault) {
109
+ return console.log('error no vault found for '+vaultId)
110
+ }
111
+ console.log('checking values in vault redeem '+vault.contracts+' '+contractsAndMargin.contracts+' ')
112
+ vault.contracts += contractsAndMargin.contracts;
113
+ vault.margin -= contractsAndMargin.margin
114
+ vault.available -= contractsAndMargin.available
115
+
116
+ //console.log('about to alter outstanding in vault '+JSON.stringify(vault)+' '+amount+' '+vault.outstanding)
117
+ vault.outstanding+=amount
118
+ //console.log(vault.outstanding)
119
+ await this.saveVault(vaultId, vault);
120
+ }
121
+
122
+ // Get vault information
123
+ static async getVault(vaultId) {
124
+ await this.initializeIfNeeded();
125
+
126
+ return this.vaults.get(vaultId);
127
+ }
128
+
129
+ // Register a new synthetic token
130
+ static async registerSyntheticToken(syntheticTokenId, contractId, propertyId) {
131
+ await this.initializeIfNeeded();
132
+ this.syntheticTokens.set(syntheticTokenId, {contract: contractId, property: propertyId});
133
+ await this.saveSyntheticToken(syntheticTokenId);
134
+ }
135
+
136
+ // Check if a synthetic token exists
137
+ static async exists(syntheticTokenId) {
138
+ const base = await db.getDatabase('syntheticTokens')
139
+ const vaultsData = base.findOneAsync({ _id: syntheticTokenId });
140
+ //console.log('inside exists ' + syntheticTokenId + ' ' + JSON.stringify(vaultsData));
141
+ return vaultsData !== null;
142
+ }
143
+
144
+
145
+ // Get vault ID for a synthetic token
146
+ static async getVaultId(syntheticTokenId) {
147
+ await this.initializeIfNeeded();
148
+ return this.syntheticTokens.get(syntheticTokenId)?.vaultId;
149
+ }
150
+
151
+ // Persist vault data to the database
152
+ static async saveVault(vaultId, vault) {
153
+ await this.initializeIfNeeded();
154
+ const vaultDB = await db.getDatabase('vaults');
155
+ await vaultDB.updateAsync(
156
+ { _id: vaultId },
157
+ { _id: vaultId, value: JSON.stringify(vault) },
158
+ { upsert: true }
159
+ );
160
+ }
161
+
162
+ // Persist synthetic token data to the database
163
+ static async saveSyntheticToken(syntheticTokenId) {
164
+ await this.initializeIfNeeded();
165
+ const synthDB = await db.getDatabase('syntheticTokens');
166
+ await synthDB.updateAsync(
167
+ { _id: `${syntheticTokenId}` },
168
+ { _id: `${syntheticTokenId}`, value: JSON.stringify(this.syntheticTokens.get(syntheticTokenId)) },
169
+ { upsert: true }
170
+ );
171
+ }
172
+
173
+ // Load vaults and synthetic tokens from the database
174
+ static async loadFromDatabase() {
175
+ console.log('about to load');
176
+
177
+ // Ensure the database queries are awaited properly
178
+ const base = await db.getDatabase('vaults')
179
+ const vaultsData = await base.findOneAsync({});
180
+ //console.log('Vaults Data:', Array.isArray(vaultsData) ? vaultsData.length : 0, 'items');
181
+
182
+ if (Array.isArray(vaultsData) && vaultsData.length > 0) {
183
+ vaultsData.forEach(vault => {
184
+ this.vaults.set(vault._id, vault.data);
185
+ });
186
+ } else {
187
+ console.log('No vaults found or vaultsData is not an array.');
188
+ }
189
+
190
+ const syntheticTokensBase = await db.getDatabase('syntheticTokens')
191
+ const syntheticTokensData= syntheticTokensBase.findOneAsync({});
192
+ //console.log('Synthetic Tokens Data:', Array.isArray(syntheticTokensData) ? syntheticTokensData.length : 0, 'items');
193
+
194
+ if (Array.isArray(syntheticTokensData) && syntheticTokensData.length > 0) {
195
+ syntheticTokensData.forEach(synth => {
196
+ this.syntheticTokens.set(synth._id, synth.data);
197
+ });
198
+ } else {
199
+ console.log('No synthetic tokens found or syntheticTokensData is not an array.');
200
+ }
201
+ }
202
+
203
+
204
+ // Method to transfer synthetic currency units
205
+ static async sendSyntheticCurrency(senderAddress, receiverAddress, syntheticTokenId, amount, channelTransfer) {
206
+ await this.initializeIfNeeded();
207
+ const vaultId = this.getVaultId(syntheticTokenId);
208
+ if (!vaultId) {
209
+ throw new Error('Vault not found for the given synthetic token ID');
210
+ }
211
+
212
+ if (!channelTransfer) {
213
+ const senderBalance = await TallyMap.getAddressBalance(senderAddress, syntheticTokenId);
214
+ if (senderBalance < amount) {
215
+ throw new Error('Insufficient balance for transfer');
216
+ }
217
+
218
+ await TallyMap.updateBalance(senderAddress, syntheticTokenId, -amount);
219
+ await TallyMap.updateBalance(receiverAddress, syntheticTokenId, amount);
220
+ } else {
221
+ const channel = await this.getChannel(senderAddress);
222
+ if (!channel) {
223
+ throw new Error('Channel not found');
224
+ }
225
+
226
+ // Implement the logic to check and update channel balances
227
+ // ...
228
+ }
229
+ }
230
+
231
+ // Method to trade synthetic currency
232
+ static async tradeSyntheticCurrency(tradeDetails, channelTrade) {
233
+ await this.initializeIfNeeded();
234
+ const { syntheticTokenId, amount, price, sellerAddress, buyerAddress } = tradeDetails;
235
+
236
+ if (!channelTrade) {
237
+ const orderBookKey = `synth-${syntheticTokenId}`;
238
+ await Orderbook.insertOrder(orderBookKey, tradeDetails);
239
+ const matchResult = await Orderbook.matchOrders(orderBookKey);
240
+ if (matchResult.matches && matchResult.matches.length > 0) {
241
+ // Process matches
242
+ // ...
243
+ }
244
+ } else {
245
+ const channel = await this.getChannel(sellerAddress);
246
+ if (!channel) {
247
+ throw new Error('Channel not found');
248
+ }
249
+
250
+ // Implement the logic to record and process the trade within the channel
251
+ // ...
252
+ }
253
+ }
254
+
255
+ // Method to post synthetic currency as margin
256
+ static async postMargin(address, syntheticTokenId, amount, contractId) {
257
+ await this.initializeIfNeeded();
258
+ const { underlyingPropertyId, hedgeContractId, vaultId } = SynthRegistry.parseSyntheticTokenId(syntheticTokenId);
259
+ if (!SynthRegistry.isValidSyntheticTokenId(underlyingPropertyId, hedgeContractId, vaultId)) {
260
+ throw new Error('Invalid synthetic token ID');
261
+ }
262
+
263
+ const syntheticTokenBalance = await TallyMap.getAddressBalance(address, syntheticTokenId);
264
+ if (syntheticTokenBalance < amount) {
265
+ throw new Error('Insufficient balance for margin posting');
266
+ }
267
+
268
+ await TallyMap.updateBalance(address, syntheticTokenId, -amount, 0, amount, 0);
269
+
270
+ const marginMap = await MarginMap.loadMarginMap(contractId);
271
+ marginMap.updateMargin(address, amount, syntheticTokenId);
272
+ await MarginMap.saveMarginMap(contractId, marginMap);
273
+
274
+ console.log(`Posted ${amount} of synthetic token ID ${syntheticTokenId} as margin for contract ID ${contractId}`);
275
+ }
276
+
277
+ // Method to generate a compound synthetic token identifier
278
+ static generateSyntheticTokenId(underlyingPropertyId, hedgeContractId) {
279
+ return `${underlyingPropertyId}-${hedgeContractId}`;
280
+ }
281
+
282
+ // Method to parse a compound synthetic token identifier
283
+ static parseSyntheticTokenId(syntheticTokenId) {
284
+
285
+ const parts = syntheticTokenId.split('-');
286
+ if (parts.length !== 3) {
287
+ throw new Error('Invalid synthetic token ID format');
288
+ }
289
+ const [underlyingPropertyId, hedgeContractId] = parts.map(part => parseInt(part));
290
+ return { underlyingPropertyId, hedgeContractId};
291
+ }
292
+
293
+ // Method to find a vault based on a compound synthetic token identifier
294
+ static async findVaultIdByCompoundIdentifier(underlyingPropertyId, hedgeContractId) {
295
+ await this.initializeIfNeeded();
296
+ for (const [vaultId, vaultData] of this.vaults.entries()) {
297
+ if (vaultData.underlyingPropertyId === underlyingPropertyId &&
298
+ vaultData.hedgeContractId === hedgeContractId) {
299
+ return vaultId;
300
+ }
301
+ }
302
+ return null;
303
+ }
304
+
305
+ // Method to reuse vault numbers
306
+ static async reuseVaultNumber() {
307
+ await this.initializeIfNeeded();
308
+ const availableVaults = Array.from(this.vaults.keys()).filter(vaultId => {
309
+ const vault = this.vaults.get(vaultId);
310
+ return vault.isEmpty || vault.isExpired; // Assuming vaults have 'isEmpty' or 'isExpired' properties
311
+ });
312
+
313
+ return availableVaults.length > 0 ? availableVaults[0] : this.generateVaultId();
314
+ }
315
+
316
+ // Function to check if a property ID is a synthetic token
317
+ static async isSyntheticProperty(propertyId) {
318
+ await this.initializeIfNeeded();
319
+ if (propertyId.toString().includes('-')) {
320
+ const [underlyingPropertyId, hedgeContractId] = propertyId.toString().split('-');
321
+ return this.isValidPropertyId(underlyingPropertyId) && this.isValidContractId(hedgeContractId);
322
+ }
323
+ return false;
324
+ }
325
+
326
+
327
+ // Function to parse a compound synthetic token ID
328
+ static async parseSyntheticTokenId(syntheticTokenId) {
329
+ const parts = syntheticTokenId.split('-');
330
+ if (parts.length === 3) {
331
+ const [underlyingPropertyId, hedgeContractId, vaultId] = parts;
332
+ // Validate parts and return the parsed data
333
+ return { underlyingPropertyId, hedgeContractId, vaultId };
334
+ }
335
+ throw new Error('Invalid synthetic token ID format');
336
+ }
337
+
338
+ // Function to validate a property ID
339
+ static async isValidPropertyId(propertyId) {
340
+ try {
341
+ // Load property data from the PropertyManager
342
+ await PropertyManager.load();
343
+ const propertyData = PropertyManager.propertyIndex.get(parseInt(propertyId));
344
+ return Boolean(propertyData); // True if property exists, false otherwise
345
+ } catch (error) {
346
+ console.error(`Error validating property ID ${propertyId}:`, error);
347
+ return false;
348
+ }
349
+ }
350
+
351
+ // Function to validate a contract ID
352
+ static async isValidContractId(contractId) {
353
+ try {
354
+ // Check if the contract exists in the ContractsRegistry
355
+ const contractInfo = await ContractsRegistry.getContractInfo(contractId);
356
+ return Boolean(contractInfo); // True if contract exists, false otherwise
357
+ } catch (error) {
358
+ console.error(`Error validating contract ID ${contractId}:`, error);
359
+ return false;
360
+ }
361
+ }
362
+
363
+ static async applyPerpetualSwapFunding(vaultId, contractId, fundingRate) {
364
+ this.initializeIfNeeded();
365
+ const vault = this.vaults.get(vaultId);
366
+ if (!vault) {
367
+ throw new Error('Vault not found');
368
+ }
369
+
370
+ // Query contract balance in the vault for the specified contractId
371
+ const contractBalance = vault.contracts[contractId];
372
+ if (!contractBalance) {
373
+ console.log(`No contract balance found for contract ID ${contractId} in vault ${vaultId}`);
374
+ return;
375
+ }
376
+
377
+ // Calculate the funding amount based on the funding rate and the contract balance
378
+ const fundingAmount = contractBalance * fundingRate;
379
+
380
+ // Apply the funding amount to the contract's balance in the vault
381
+ vault.contracts[contractId] += fundingAmount;
382
+
383
+ // Optionally, adjust the total amount in the vault if needed
384
+ // vault.amount += fundingAmount; // Uncomment and adjust as necessary
385
+
386
+ // Save the updated vault
387
+ await this.saveVault(vaultId);
388
+
389
+ console.log(`Applied funding to contract ${contractId} in vault ${vaultId}: ${fundingAmount}`);
390
+ }
391
+
392
+ static async rebaseSyntheticCurrency(vaultId, changeInValue) {
393
+ await this.initializeIfNeeded();
394
+ const syntheticTokenId = this.findSyntheticTokenIdByVaultId(vaultId);
395
+ if (!syntheticTokenId) {
396
+ throw new Error('Synthetic token not found for the given vault ID');
397
+ }
398
+
399
+ const syntheticToken = this.syntheticTokens.get(syntheticTokenId);
400
+ if (!syntheticToken) {
401
+ throw new Error('Synthetic token not found');
402
+ }
403
+
404
+ // Calculate the new amount based on the change in value
405
+ const newAmount = syntheticToken.amount * (1 + changeInValue);
406
+
407
+ // Update the synthetic token's amount
408
+ syntheticToken.amount = newAmount;
409
+
410
+ // Save the updated synthetic token
411
+ await this.saveSyntheticToken(syntheticTokenId);
412
+
413
+ console.log(`Rebased synthetic currency ${syntheticTokenId}: new amount ${newAmount}`);
414
+ }
415
+
416
+ static async findSyntheticTokenIdByVaultId(vaultId) {
417
+ await this.initializeIfNeeded();
418
+ // Logic to find the synthetic token ID associated with a given vault ID
419
+ for (const [synthId, tokenInfo] of this.syntheticTokens.entries()) {
420
+ if (tokenInfo.vaultId === vaultId) {
421
+ return synthId;
422
+ }
423
+ }
424
+ return null;
425
+ }
426
+
427
+ // ... other necessary methods ...
428
+ }
429
+
430
+ module.exports = SynthRegistry;