@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.
- package/.claude/settings.local.json +13 -0
- package/.claude/skills/tl-algo/SKILL.md +255 -0
- package/.gitattributes +2 -0
- package/.github/workflows/publish.yaml +26 -0
- package/4mm.js +163 -0
- package/LICENSE +21 -0
- package/NPMSwapRefactor.zip +0 -0
- package/README.md +217 -0
- package/address.sh +26 -0
- package/algoAPI.js +581 -0
- package/analyzepsbt.js +92 -0
- package/apiEx.js +99 -0
- package/bb_hyperscalper.js +290 -0
- package/bbo_demo.js +111 -0
- package/buyer.js +622 -0
- package/client.js +50 -0
- package/createTxTest.js +26 -0
- package/createWallet.js +75 -0
- package/daytrader.js +531 -0
- package/decodeTest.js +69 -0
- package/fundingManager.js +144 -0
- package/index.js +4 -0
- package/listener.js +27 -0
- package/litecoreTxBuilder.js +1128 -0
- package/mmEx.js +356 -0
- package/networks.js +51 -0
- package/orderbook.js +200 -0
- package/package.json +34 -0
- package/perTradeQueue.js +36 -0
- package/projectsTLNPMTLNPM/package-lock.json +162 -0
- package/projectsTLNPMTLNPM/package.json +5 -0
- package/quick.js +32 -0
- package/quickFut.js +37 -0
- package/quickSell.js +37 -0
- package/relayerClient.js +117 -0
- package/run4mm.js +80 -0
- package/run_bbo_tracker.js +241 -0
- package/seller.js +443 -0
- package/session.js +45 -0
- package/setup-lin-ltc.sh +139 -0
- package/setup-lin.sh +203 -0
- package/setup-win-ltc.bat +108 -0
- package/setup-win.bat +167 -0
- package/spam_screamer_futures.js +222 -0
- package/tradelayer.js/.gitattributes +2 -0
- package/tradelayer.js/README.md +2 -0
- package/tradelayer.js/oldTests/activationTest.js +6 -0
- package/tradelayer.js/oldTests/base58.test.js +23 -0
- package/tradelayer.js/oldTests/base64Decode.test.js +16 -0
- package/tradelayer.js/oldTests/blocksRefactor.js +140 -0
- package/tradelayer.js/oldTests/checkVestBalance.js +25 -0
- package/tradelayer.js/oldTests/consensusHashProto.js +151 -0
- package/tradelayer.js/oldTests/contractOrderbook.js +243 -0
- package/tradelayer.js/oldTests/createPayload.js +0 -0
- package/tradelayer.js/oldTests/createTestnetAddr.js +43 -0
- package/tradelayer.js/oldTests/decode.js +205 -0
- package/tradelayer.js/oldTests/decodeTest.js +50 -0
- package/tradelayer.js/oldTests/displayTallyMap.js +19 -0
- package/tradelayer.js/oldTests/encodeDecode.js +340 -0
- package/tradelayer.js/oldTests/expressTest.js +29 -0
- package/tradelayer.js/oldTests/extractBlocksVanilla.js +214 -0
- package/tradelayer.js/oldTests/extractBlocksVanillaa.js +179 -0
- package/tradelayer.js/oldTests/extractPubkeyTest.js +60 -0
- package/tradelayer.js/oldTests/fillInputCacheProto.js +111 -0
- package/tradelayer.js/oldTests/getRawTxTest.js +22 -0
- package/tradelayer.js/oldTests/indexTest.js +26 -0
- package/tradelayer.js/oldTests/initTokensTest.js +32 -0
- package/tradelayer.js/oldTests/interfaceChild.js +129 -0
- package/tradelayer.js/oldTests/listenerChild.js +112 -0
- package/tradelayer.js/oldTests/opdecode.js +26 -0
- package/tradelayer.js/oldTests/options.js +79 -0
- package/tradelayer.js/oldTests/optxtest.js +116 -0
- package/tradelayer.js/oldTests/optxtest1.js +64 -0
- package/tradelayer.js/oldTests/oracle.test.js +32 -0
- package/tradelayer.js/oldTests/orderbook.test.js +36 -0
- package/tradelayer.js/oldTests/parsing.js +93 -0
- package/tradelayer.js/oldTests/payload.js +13 -0
- package/tradelayer.js/oldTests/persistenceUnitTest.js +23 -0
- package/tradelayer.js/oldTests/property.test.js +53 -0
- package/tradelayer.js/oldTests/propertyLevel.js +75 -0
- package/tradelayer.js/oldTests/propertyTest.js +32 -0
- package/tradelayer.js/oldTests/queryAddressTest.js +17 -0
- package/tradelayer.js/oldTests/salter.js +14 -0
- package/tradelayer.js/oldTests/tally.js +81 -0
- package/tradelayer.js/oldTests/tally.test.js +48 -0
- package/tradelayer.js/oldTests/tally2.js +124 -0
- package/tradelayer.js/oldTests/tally3.js +142 -0
- package/tradelayer.js/oldTests/tallyDiag.js +38 -0
- package/tradelayer.js/oldTests/testGetRaw.js +40 -0
- package/tradelayer.js/oldTests/testHexConvert.js +47 -0
- package/tradelayer.js/oldTests/testNewEncoding.js +96 -0
- package/tradelayer.js/oldTests/testNewEncoding2.js +113 -0
- package/tradelayer.js/oldTests/testNewEncoding3 +112 -0
- package/tradelayer.js/oldTests/testNewEncoding3.js +168 -0
- package/tradelayer.js/oldTests/testOPReturn.js +102 -0
- package/tradelayer.js/oldTests/testPayload.js +23 -0
- package/tradelayer.js/oldTests/testRaw.js +50 -0
- package/tradelayer.js/oldTests/testSendTooMuch.js +20 -0
- package/tradelayer.js/oldTests/testTxBuild +28 -0
- package/tradelayer.js/oldTests/testTxBuild.js +42 -0
- package/tradelayer.js/oldTests/tokenOrderbook.js +243 -0
- package/tradelayer.js/oldTests/txUtilsA.js +515 -0
- package/tradelayer.js/oldTests/validityUnitTest.js +53 -0
- package/tradelayer.js/oldTests/vaults.js +72 -0
- package/tradelayer.js/oldTests/volumeIndex.js +117 -0
- package/tradelayer.js/oldTests/volumeIndex2.js +88 -0
- package/tradelayer.js/output_base64.txt +1 -0
- package/tradelayer.js/package-lock.json +9967 -0
- package/tradelayer.js/package.json +61 -0
- package/tradelayer.js/server/index.js +88 -0
- package/tradelayer.js/server/litecoind.exe +0 -0
- package/tradelayer.js/src/activation.js +303 -0
- package/tradelayer.js/src/adjuster.js +77 -0
- package/tradelayer.js/src/amm.js +400 -0
- package/tradelayer.js/src/base256.js +55 -0
- package/tradelayer.js/src/base94.js +79 -0
- package/tradelayer.js/src/channels.js +1163 -0
- package/tradelayer.js/src/clearing.js +3109 -0
- package/tradelayer.js/src/clearlist.js +364 -0
- package/tradelayer.js/src/client.js +295 -0
- package/tradelayer.js/src/consensus.js +613 -0
- package/tradelayer.js/src/contractRegistry.js +964 -0
- package/tradelayer.js/src/db.js +89 -0
- package/tradelayer.js/src/init.js +24 -0
- package/tradelayer.js/src/insurance.js +347 -0
- package/tradelayer.js/src/interface.js +218 -0
- package/tradelayer.js/src/interfaceExpress.js +178 -0
- package/tradelayer.js/src/iou.js +509 -0
- package/tradelayer.js/src/listener.js +226 -0
- package/tradelayer.js/src/logic.js +1702 -0
- package/tradelayer.js/src/main.js +927 -0
- package/tradelayer.js/src/marginMap.js +2165 -0
- package/tradelayer.js/src/options.js +126 -0
- package/tradelayer.js/src/oracle.js +394 -0
- package/tradelayer.js/src/orderbook.js +4123 -0
- package/tradelayer.js/src/persistence.js +554 -0
- package/tradelayer.js/src/property.js +411 -0
- package/tradelayer.js/src/reOrg.js +41 -0
- package/tradelayer.js/src/scaling.js +145 -0
- package/tradelayer.js/src/tally.js +1275 -0
- package/tradelayer.js/src/tradeHistoryManager.js +552 -0
- package/tradelayer.js/src/txDecoder.js +584 -0
- package/tradelayer.js/src/txEncoder.js +610 -0
- package/tradelayer.js/src/txIndex.js +502 -0
- package/tradelayer.js/src/txUtils.js +1392 -0
- package/tradelayer.js/src/types.js +429 -0
- package/tradelayer.js/src/validity.js +3077 -0
- package/tradelayer.js/src/vaults.js +430 -0
- package/tradelayer.js/src/vesting.js +491 -0
- package/tradelayer.js/src/volumeIndex.js +618 -0
- package/tradelayer.js/src/walletInterface.js +220 -0
- package/tradelayer.js/src/walletListener.js +665 -0
- package/tradelayer.js/tests/256decode.js +82 -0
- package/tradelayer.js/tests/UTXOracle.js +205 -0
- package/tradelayer.js/tests/base94test.js +23 -0
- package/tradelayer.js/tests/cancelTxTest.js +62 -0
- package/tradelayer.js/tests/contractInterfaceTest.js +48 -0
- package/tradelayer.js/tests/decimalTest.js +65 -0
- package/tradelayer.js/tests/decoderTest.js +100 -0
- package/tradelayer.js/tests/deltaCount.js +47 -0
- package/tradelayer.js/tests/deltaCount2.js +60 -0
- package/tradelayer.js/tests/interfaceTest.js +37 -0
- package/tradelayer.js/tests/mainTest.js +53 -0
- package/tradelayer.js/tests/makeActivationTest.js +24 -0
- package/tradelayer.js/tests/maxHeightTest.js +49 -0
- package/tradelayer.js/tests/reverseHash.js +72 -0
- package/tradelayer.js/tests/sensitiveConsoleOutput.txt +267 -0
- package/tradelayer.js/tests/tallyTest.js +40 -0
- package/tradelayer.js/tests/testBuybacks.js +46 -0
- package/tradelayer.js/tests/testCodeHash.js +49 -0
- package/tradelayer.js/tests/testConsensusHash.js +91 -0
- package/tradelayer.js/tests/testDecode.js +30 -0
- package/tradelayer.js/tests/testEncodingLengths.js +129 -0
- package/tradelayer.js/tests/testGetTx +32 -0
- package/tradelayer.js/tests/testGetTx.js +32 -0
- package/tradelayer.js/tests/testHexHash.js +32 -0
- package/tradelayer.js/tests/testIndexHash.js +35 -0
- package/tradelayer.js/tests/testInitContracts.js +38 -0
- package/tradelayer.js/tests/testMaxConsensus.js +12 -0
- package/tradelayer.js/tests/testMaxSynth.js +44 -0
- package/tradelayer.js/tests/testMint.js +21 -0
- package/tradelayer.js/tests/testNetwork.js +33 -0
- package/tradelayer.js/tests/testOrderbookLoad.js +62 -0
- package/tradelayer.js/tests/testRebates.js +32 -0
- package/tradelayer.js/tests/testRedeem.js +22 -0
- package/tradelayer.js/tests/testTokenTrade.js +39 -0
- package/tradelayer.js/tests/testTxBuild.js +42 -0
- package/tradelayer.js/tests/testUTXOTrade.js +27 -0
- package/tradelayer.js/tests/tokenTradeHistory.js +27 -0
- package/tradelayer.js/tests/tradeFutures.js +40 -0
- package/tradelayer.js/tests/tradeHistoryExample.js +35 -0
- package/tradelayer.js/tests/tradeHistoryLoad.js +15 -0
- package/tradelayer.js/tests/txScanTest.js +134 -0
- package/tradelayer.js/tests/validateTest.js +136 -0
- package/tradelayer.js/tests/vestingTest.js +37 -0
- package/tradelayer.js/utils/activateMainnet.js +59 -0
- package/tradelayer.js/utils/activateMainnetDoge.js +63 -0
- package/tradelayer.js/utils/autocompactdb.js +23 -0
- package/tradelayer.js/utils/base64toHex.js +32 -0
- package/tradelayer.js/utils/broadcastDoge.js +38 -0
- package/tradelayer.js/utils/calcRedeem.js +19 -0
- package/tradelayer.js/utils/checkNetwork.js +27 -0
- package/tradelayer.js/utils/createAddress.js +48 -0
- package/tradelayer.js/utils/createAttestation.js +133 -0
- package/tradelayer.js/utils/createContract.js +118 -0
- package/tradelayer.js/utils/createOracle.js +94 -0
- package/tradelayer.js/utils/createwallet.js +20 -0
- package/tradelayer.js/utils/crossFuturesTrades.js +57 -0
- package/tradelayer.js/utils/crossTokenTrades.js +62 -0
- package/tradelayer.js/utils/dumpPriv.js +29 -0
- package/tradelayer.js/utils/generateChannel.js +34 -0
- package/tradelayer.js/utils/getInfo.js +21 -0
- package/tradelayer.js/utils/hardWipe.js +20 -0
- package/tradelayer.js/utils/hexTo64.js +16 -0
- package/tradelayer.js/utils/importAddress.js +28 -0
- package/tradelayer.js/utils/importpriv.js +20 -0
- package/tradelayer.js/utils/issueOracleContract.js +67 -0
- package/tradelayer.js/utils/issueTokens.js +41 -0
- package/tradelayer.js/utils/listunspent.js +66 -0
- package/tradelayer.js/utils/litecoinClient.js +30 -0
- package/tradelayer.js/utils/loadwallet.js +20 -0
- package/tradelayer.js/utils/publishOracle.js +113 -0
- package/tradelayer.js/utils/sendActivation.js +21 -0
- package/tradelayer.js/utils/sendChannelContractTrade.js +34 -0
- package/tradelayer.js/utils/sendChannelTokenTrade.js +34 -0
- package/tradelayer.js/utils/sendCommit.js +24 -0
- package/tradelayer.js/utils/sendDoge.js +62 -0
- package/tradelayer.js/utils/sendDogeMain.js +67 -0
- package/tradelayer.js/utils/sendDogeTx.js +46 -0
- package/tradelayer.js/utils/sendLTC.js +63 -0
- package/tradelayer.js/utils/sendMainnet.js +62 -0
- package/tradelayer.js/utils/sendTransfer.js +19 -0
- package/tradelayer.js/utils/sendVestTest.js +88 -0
- package/tradelayer.js/utils/sendWithdrawal.js +26 -0
- package/tradelayer.js/utils/simpleStart.js +8 -0
- package/tradelayer.js/utils/startStop.js +27 -0
- package/tradelayer.js/utils/structuredTrades.js +136 -0
- package/tradelayer.js/utils/verifySignature.js +90 -0
- package/tradelayer.js/utils/verifyWitnessAndScriptPubkey.js +41 -0
- package/tradelayer.js/utils/walletCache.js +172 -0
- package/tradelayer.js/utils/walletContractInterface.js +48 -0
- package/tradelayer.js/utils/walletFetchTxs.js +66 -0
- package/tradelayer.js/utils/walletUtils.js +97 -0
- package/tradelayer.js/utils/wipeDB.js +55 -0
- package/tradelayer.js/utils/wipeDBNotTx.js +50 -0
- package/txEncoder.js +529 -0
- package/utility.js +28 -0
- package/verifymessage.js +38 -0
- 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;
|