@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,20 @@
|
|
|
1
|
+
const Litecoin = require('litecoin');
|
|
2
|
+
const async = require('async')
|
|
3
|
+
const util = require('util');
|
|
4
|
+
|
|
5
|
+
const client = new Litecoin.Client({
|
|
6
|
+
host: '127.0.0.1',
|
|
7
|
+
port: 18332,
|
|
8
|
+
user: 'user',
|
|
9
|
+
pass: 'pass',
|
|
10
|
+
timeout: 1000
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const createWalletAsync = util.promisify(client.cmd.bind(client, 'createwallet'))
|
|
15
|
+
async function load(){
|
|
16
|
+
|
|
17
|
+
const createwallet = await createWalletAsync('wallet.dat')
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
load()
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const TxUtils = require('./TxUtils'); // Import your TxUtils class
|
|
2
|
+
|
|
3
|
+
async function runTestTokenTrades() {
|
|
4
|
+
const testAdminAddress = 'tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8'; // Replace with actual admin address
|
|
5
|
+
const counterparties = [
|
|
6
|
+
'tltc1qfffvwpftp8w3kv6gg6273ejtsfnu2dara5x4tr',
|
|
7
|
+
'tltc1qhgfrkv89lwp8vmygyqzt8ljvzn7g5z4sk9krw0',
|
|
8
|
+
'tltc1qr5ewrtxgj3z54gv9l47xz3cwrp6js9pgfxad2h'
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
function randomNumber(min, max) {
|
|
12
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Generate random trades
|
|
16
|
+
function generateRandomTrades(numTrades) {
|
|
17
|
+
const trades = [];
|
|
18
|
+
for (let i = 0; i < numTrades; i++) {
|
|
19
|
+
const random = randomNumber(1, 3);
|
|
20
|
+
const random2 = randomNumber(1, 10);
|
|
21
|
+
const counterparty = counterparties[i % counterparties.length];
|
|
22
|
+
trades.push({
|
|
23
|
+
contractId: 4,
|
|
24
|
+
amount: random,
|
|
25
|
+
price: random2,
|
|
26
|
+
side: true, // Assuming all trades are 'Buy' orders
|
|
27
|
+
address: counterparty,
|
|
28
|
+
insurance:false,
|
|
29
|
+
fee: false,
|
|
30
|
+
reduce: false,
|
|
31
|
+
post: false,
|
|
32
|
+
stop: false
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return trades;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const trades = generateRandomTrades(10); // Generate 10 trades for each side
|
|
39
|
+
|
|
40
|
+
// Iterate over each trade and create a transaction
|
|
41
|
+
for (let trade of trades) {
|
|
42
|
+
try {
|
|
43
|
+
console.log(`Creating trade: Offered Property ID ${trade.offeredPropertyId}, Desired Property ID ${trade.desiredPropertyId}, Address: ${trade.address}`);
|
|
44
|
+
const txId = await TxUtils.createContractOnChainTradeTransaction(
|
|
45
|
+
trade.address,
|
|
46
|
+
trade
|
|
47
|
+
);
|
|
48
|
+
console.log(`Transaction ID: ${txId}`);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error(`Error creating trade for offered property ${trade.offeredPropertyId} and desired property ${trade.desiredPropertyId}:`, error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
runTestTokenTrades()
|
|
56
|
+
.then(() => console.log('Test token trade transactions completed.'))
|
|
57
|
+
.catch(error => console.error('Error running test token trades:', error));
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const TxUtils = require('./TxUtils'); // Import your TxUtils class
|
|
2
|
+
|
|
3
|
+
async function runTestTokenTrades() {
|
|
4
|
+
const testAdminAddress = 'tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8'; // Replace with actual admin address
|
|
5
|
+
const counterparties = [
|
|
6
|
+
'tltc1qfffvwpftp8w3kv6gg6273ejtsfnu2dara5x4tr',
|
|
7
|
+
'tltc1qhgfrkv89lwp8vmygyqzt8ljvzn7g5z4sk9krw0',
|
|
8
|
+
'tltc1qr5ewrtxgj3z54gv9l47xz3cwrp6js9pgfxad2h'
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
function randomNumber(min, max) {
|
|
12
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Generate random trades
|
|
16
|
+
function generateRandomTrades(numTrades) {
|
|
17
|
+
const trades = [];
|
|
18
|
+
for (let i = 0; i < numTrades; i++) {
|
|
19
|
+
const random = randomNumber(1, 10);
|
|
20
|
+
const random2 = randomNumber(1, 10);
|
|
21
|
+
const counterparty = counterparties[i % counterparties.length];
|
|
22
|
+
trades.push({
|
|
23
|
+
offeredPropertyId: 4,
|
|
24
|
+
desiredPropertyId: 5,
|
|
25
|
+
amountOffered: random,
|
|
26
|
+
amountExpected: random2,
|
|
27
|
+
address: testAdminAddress
|
|
28
|
+
});
|
|
29
|
+
trades.push({
|
|
30
|
+
offeredPropertyId: 5,
|
|
31
|
+
desiredPropertyId: 4,
|
|
32
|
+
amountOffered: random2,
|
|
33
|
+
amountExpected: random,
|
|
34
|
+
address: counterparty
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return trades;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const trades = generateRandomTrades(10); // Generate 10 trades for each side
|
|
41
|
+
|
|
42
|
+
// Iterate over each trade and create a transaction
|
|
43
|
+
for (let trade of trades) {
|
|
44
|
+
try {
|
|
45
|
+
console.log(`Creating trade: Offered Property ID ${trade.offeredPropertyId}, Desired Property ID ${trade.desiredPropertyId}, Address: ${trade.address}`);
|
|
46
|
+
const txId = await TxUtils.tokenTradeTransaction(
|
|
47
|
+
trade.address,
|
|
48
|
+
trade.offeredPropertyId,
|
|
49
|
+
trade.desiredPropertyId,
|
|
50
|
+
trade.amountOffered,
|
|
51
|
+
trade.amountExpected
|
|
52
|
+
);
|
|
53
|
+
console.log(`Transaction ID: ${txId}`);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error(`Error creating trade for offered property ${trade.offeredPropertyId} and desired property ${trade.desiredPropertyId}:`, error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
runTestTokenTrades()
|
|
61
|
+
.then(() => console.log('Test token trade transactions completed.'))
|
|
62
|
+
.catch(error => console.error('Error running test token trades:', error));
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
const litecoin = require('litecoin');
|
|
4
|
+
|
|
5
|
+
// Configure your Litecoin client connection
|
|
6
|
+
const clientConfig = {
|
|
7
|
+
host: '127.0.0.1',
|
|
8
|
+
port: 18332, // Testnet port; use 9332 for Mainnet
|
|
9
|
+
user: 'user',
|
|
10
|
+
pass: 'pass',
|
|
11
|
+
timeout: 30000
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const client = new litecoin.Client(clientConfig);
|
|
15
|
+
|
|
16
|
+
// Function to dump the private key
|
|
17
|
+
function dumpPrivKey(address) {
|
|
18
|
+
client.cmd('dumpprivkey', address, function(err, privateKey, resHeaders) {
|
|
19
|
+
if (err) {
|
|
20
|
+
console.error('Error dumping private key:', err);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
console.log(`Private key for address ${address}: ${privateKey}`);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Replace with the address you want to get the private key for
|
|
28
|
+
const address = 'LNmiS6p8z3KuHHx3q6Jf6x6TfcyptE68oP';
|
|
29
|
+
dumpPrivKey(address);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const litecore = require('bitcore-lib-ltc');
|
|
2
|
+
const { TradeChannels } = require('./tradeChannels.js');
|
|
3
|
+
|
|
4
|
+
async function setupTradeChannel(privateKeyA, privateKeyB) {
|
|
5
|
+
const tradeChannels = new TradeChannels();
|
|
6
|
+
|
|
7
|
+
// Extract public keys from the private keys
|
|
8
|
+
const publicKeyA = new litecore.PrivateKey(privateKeyA).toPublicKey();
|
|
9
|
+
const publicKeyB = new litecore.PrivateKey(privateKeyB).toPublicKey();
|
|
10
|
+
|
|
11
|
+
// Create multisig address from public keys
|
|
12
|
+
const multisigAddress = new litecore.Address([publicKeyA, publicKeyB], 2).toString();
|
|
13
|
+
|
|
14
|
+
// Create a new trade channel with the multisig address as the channel ID
|
|
15
|
+
const tradeChannel = tradeChannels.createChannel(multisigAddress, 'addressA', 'addressB');
|
|
16
|
+
|
|
17
|
+
// Commit transactions to the channel
|
|
18
|
+
let commitTx1 = await commitTransaction('addressA', 'addressB', propertyId1, amount1, privateKeyA);
|
|
19
|
+
let commitTx2 = await commitTransaction('addressB', 'addressA', propertyId2, amount2, privateKeyB);
|
|
20
|
+
|
|
21
|
+
// Add commitments to the channel
|
|
22
|
+
tradeChannel.addCommitment(commitTx1);
|
|
23
|
+
tradeChannel.addCommitment(commitTx2);
|
|
24
|
+
|
|
25
|
+
// Return the trade channel for further processing
|
|
26
|
+
return tradeChannel;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Example usage with test private keys
|
|
30
|
+
const privateKeyA = '...'; // Replace with private key for address A
|
|
31
|
+
const privateKeyB = '...'; // Replace with private key for address B
|
|
32
|
+
setupTradeChannel(privateKeyA, privateKeyB).then(tradeChannel => {
|
|
33
|
+
console.log('Trade Channel Setup:', tradeChannel);
|
|
34
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const Litecoin = require('litecoin');
|
|
2
|
+
const async = require('async')
|
|
3
|
+
const util = require('util');
|
|
4
|
+
|
|
5
|
+
const client = new Litecoin.Client({
|
|
6
|
+
host: '127.0.0.1',
|
|
7
|
+
port: 18332,
|
|
8
|
+
user: 'user',
|
|
9
|
+
pass: 'pass',
|
|
10
|
+
timeout: 1000
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const getInfoAsync = util.promisify(client.cmd.bind(client, 'getblockchaininfo'))
|
|
15
|
+
async function load(){
|
|
16
|
+
|
|
17
|
+
const info = await getInfoAsync()
|
|
18
|
+
console.log(JSON.stringify(info))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
load()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
const dbDir = './nedb-data'; // Change to your database directory
|
|
5
|
+
|
|
6
|
+
// Function to delete all files in the directory
|
|
7
|
+
function wipeDatabase() {
|
|
8
|
+
fs.readdir(dbDir, (err, files) => {
|
|
9
|
+
if (err) throw err;
|
|
10
|
+
|
|
11
|
+
for (const file of files) {
|
|
12
|
+
fs.unlink(path.join(dbDir, file), err => {
|
|
13
|
+
if (err) throw err;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
console.log('Database wiped successfully.');
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
wipeDatabase();
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
|
|
3
|
+
function hexToBase64(hex) {
|
|
4
|
+
// Convert hex to a buffer, then encode it to base64
|
|
5
|
+
const buffer = Buffer.from(hex, 'hex');
|
|
6
|
+
return buffer.toString('base64');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// Example usage
|
|
10
|
+
const hexString = '010000000148a578b5c7aae54b1f33f480d992054371884ba8efe3fb4f9f7f7dd2ffc8a932000000006a47304402206f0318f343860c21ea1ede8b3186b5b5da8448d313da0fa04ad4144388730ee0022062d0466bf1e844db42b448d8a78050e3a86413fa9f8d6209f5a6897c9c9b177c012102b72f530678baac030e896f5f6b1ffaf334dea4b10c8aff3923a335053f43ce93ffffffff020065cd1d000000001976a914be98d27a5fc1fb73d7cb487da7d56d49feacfd3588ac0000000000000000406a3e746c30303b313b323b333b342c33356735726a31343972776d71367835356567703730757867717239396c769c6f3661366433316b7a6163676a3762313900000000';
|
|
11
|
+
|
|
12
|
+
const base64String = hexToBase64(hexString);
|
|
13
|
+
console.log('Base64:', base64String);
|
|
14
|
+
|
|
15
|
+
// Optionally, write the base64 string to a file for easy transcription
|
|
16
|
+
fs.writeFileSync('output_base64.txt', base64String);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const litecoin = require('litecoin');
|
|
2
|
+
|
|
3
|
+
const clientConfig = {
|
|
4
|
+
host: '127.0.0.1',
|
|
5
|
+
port: 18332,
|
|
6
|
+
user: 'user', // Replace with your RPC username
|
|
7
|
+
pass: 'pass', // Replace with your RPC password
|
|
8
|
+
timeout: 10000
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const client = new litecoin.Client(clientConfig);
|
|
12
|
+
|
|
13
|
+
// Function to import an address
|
|
14
|
+
function importAddress(address) {
|
|
15
|
+
client.cmd('importaddress', address, '', false, function(err, response, resHeaders) {
|
|
16
|
+
if (err) {
|
|
17
|
+
console.error('Error importing address:', err);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
console.log('Address imported successfully:', response);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Replace with the address you want to import
|
|
25
|
+
const addressToImport = "mj4iTwbHiQX6objWNXHjerF2KQDFcPCdUx";
|
|
26
|
+
|
|
27
|
+
// Execute the function
|
|
28
|
+
importAddress(addressToImport);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const Litecoin = require('litecoin');
|
|
2
|
+
const async = require('async')
|
|
3
|
+
const util = require('util');
|
|
4
|
+
|
|
5
|
+
const client = new Litecoin.Client({
|
|
6
|
+
host: '127.0.0.1',
|
|
7
|
+
port: 18332,
|
|
8
|
+
user: 'user',
|
|
9
|
+
pass: 'pass',
|
|
10
|
+
timeout: 1000
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const importPrivKeyAsync = util.promisify(client.cmd.bind(client, 'importprivkey'))
|
|
15
|
+
async function load(){
|
|
16
|
+
|
|
17
|
+
const imported = await importPrivKeyAsync('cNGCJhHBSQM2Kedc8Zc6x9VYe9dQuvanqfS61D3tczZnDD3HwYUW')
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
load()
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const crypto = require('crypto');
|
|
2
|
+
const TxUtils = require('../src/txUtils.js'); // Assuming TxUtils contains the necessary transaction utility functions
|
|
3
|
+
const client = require('../src/client.js')
|
|
4
|
+
|
|
5
|
+
// Function to create a random ticker
|
|
6
|
+
function createRandomTicker(length = 5) {
|
|
7
|
+
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
8
|
+
let result = '';
|
|
9
|
+
for (let i = 0; i < length; i++) {
|
|
10
|
+
result += characters.charAt(Math.floor(Math.random() * characters.length));
|
|
11
|
+
}
|
|
12
|
+
return result;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Function to generate a random number within a range
|
|
16
|
+
function randomNumber(min, max) {
|
|
17
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Function to create an oracle and then issue a contract
|
|
21
|
+
async function createOracleAndIssueContract() {
|
|
22
|
+
|
|
23
|
+
const instance = new client()
|
|
24
|
+
instance.init()
|
|
25
|
+
await new Promise(resolve => setTimeout(resolve, 700));
|
|
26
|
+
|
|
27
|
+
const adminAddress = 'tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8'; // Replace with the actual admin address
|
|
28
|
+
const backupAddress = 'LNmiS6p8z3KuHHx3q6Jf6x6TfcyptE68oP'; // Replace with an actual backup address
|
|
29
|
+
|
|
30
|
+
// Create Oracle Parameters
|
|
31
|
+
const oracleTicker = "BTC/USD";
|
|
32
|
+
const oracleUrl = "bravenewcoin.com";
|
|
33
|
+
|
|
34
|
+
// Create Contract Series Parameters
|
|
35
|
+
const contractSeriesTicker = "BTC/USD-BLX";
|
|
36
|
+
const underlyingOracleId = 1; // Placeholder, replace with actual oracle ID after creation
|
|
37
|
+
const notionalPropertyId = null; // Random property ID for testing
|
|
38
|
+
const collateralPropertyId = 3; // Random collateral property ID for testing
|
|
39
|
+
const leverage = 10; // Example leverage
|
|
40
|
+
const expiryPeriod = 17532; // Example expiry period
|
|
41
|
+
const series = 5; // Number of contracts in the series
|
|
42
|
+
|
|
43
|
+
console.log(`Creating an oracle: ${oracleTicker}`);
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
// Create Oracle
|
|
47
|
+
const oracleTxId = await TxUtils.createOracleTransaction(adminAddress, {
|
|
48
|
+
ticker: oracleTicker,
|
|
49
|
+
url: oracleUrl,
|
|
50
|
+
backupAddress: backupAddress,
|
|
51
|
+
whitelists: [],
|
|
52
|
+
lag: 1
|
|
53
|
+
}, 13);
|
|
54
|
+
|
|
55
|
+
console.log(`Oracle created successfully. Transaction ID: ${oracleTxId}`);
|
|
56
|
+
|
|
57
|
+
// Wait for oracle creation to be confirmed before issuing the contract
|
|
58
|
+
// This is just a placeholder, you should implement a proper wait/check mechanism
|
|
59
|
+
console.log('Waiting for oracle confirmation...');
|
|
60
|
+
await new Promise(resolve => setTimeout(resolve, 30000)); // 30 seconds delay
|
|
61
|
+
}catch(err){
|
|
62
|
+
console.log('err '+err)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Call the function to create an oracle and issue a contract
|
|
67
|
+
createOracleAndIssueContract();
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const crypto = require('crypto');
|
|
2
|
+
const TxUtils = require('./txUtils.js')
|
|
3
|
+
// Function to create a random ticker
|
|
4
|
+
function createRandomTicker(length = 5) {
|
|
5
|
+
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
6
|
+
let result = '';
|
|
7
|
+
for (let i = 0; i < length; i++) {
|
|
8
|
+
result += characters.charAt(Math.floor(Math.random() * characters.length));
|
|
9
|
+
}
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Function to generate a random number within a range
|
|
14
|
+
function randomNumber(min, max) {
|
|
15
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Function to issue a random token
|
|
19
|
+
async function issueRandomToken() {
|
|
20
|
+
const fromAddress = 'tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8';
|
|
21
|
+
const initialAmount = randomNumber(1000, 1000000); // Random amount between 1,000 and 1,000,000
|
|
22
|
+
const ticker = createRandomTicker();
|
|
23
|
+
const whitelists = []; // Assuming no whitelists for simplicity
|
|
24
|
+
const managed = false; // Managed flag set to false
|
|
25
|
+
const backupAddress = 'LNmiS6p8z3KuHHx3q6Jf6x6TfcyptE68oP'; // Replace with an actual backup address
|
|
26
|
+
const nft = true; // NFT flag set to false
|
|
27
|
+
|
|
28
|
+
console.log(`Issuing a new token:
|
|
29
|
+
- Ticker: ${ticker}
|
|
30
|
+
- Initial Amount: ${initialAmount}`);
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
const txid = await TxUtils.issuePropertyTransaction(fromAddress, initialAmount, ticker, whitelists, managed, backupAddress, nft);
|
|
34
|
+
console.log(`Token issued successfully. Transaction ID: ${txid}`);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.error('Error issuing token:', error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Call the function to issue a random token
|
|
41
|
+
issueRandomToken();
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const async = require('async');
|
|
2
|
+
const util = require('util');
|
|
3
|
+
const litecore = require('bitcore-lib-ltc');
|
|
4
|
+
const litecoin = require('litecoin');
|
|
5
|
+
|
|
6
|
+
// Litecoin client configuration (make sure your daemon is running and the RPC parameters are correct)
|
|
7
|
+
const clientConfig = {
|
|
8
|
+
host: '127.0.0.1',
|
|
9
|
+
port: 18332,
|
|
10
|
+
user: 'user',
|
|
11
|
+
pass: 'pass',
|
|
12
|
+
timeout: 10000
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const client = new litecoin.Client(clientConfig);
|
|
16
|
+
|
|
17
|
+
// Promisify client functions for `listunspent` and `getaddressesbylabel`
|
|
18
|
+
const listUnspentAsync = util.promisify(client.cmd.bind(client, 'listunspent'));
|
|
19
|
+
const getAddressesByLabelAsync = util.promisify(client.cmd.bind(client, 'getaddressesbylabel'));
|
|
20
|
+
const getListReceivedByAddressAsync = util.promisify(client.cmd.bind(client, 'listreceivedbyaddress'))
|
|
21
|
+
const getMempool = util.promisify(client.cmd.bind(client, 'getrawmempool'))
|
|
22
|
+
// Fetch UTXOs for all addresses in the wallet
|
|
23
|
+
async function listUnspentForAllAddresses() {
|
|
24
|
+
|
|
25
|
+
const allAddresses = await getListReceivedByAddressAsync(0, true)
|
|
26
|
+
|
|
27
|
+
console.log('all addresses '+JSON.stringify(allAddresses))
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
// Fetch all wallet addresses with a label (e.g., "" means all addresses)
|
|
31
|
+
const label = "tl-wallet"; // Empty string means fetch all addresses
|
|
32
|
+
const addressesByLabel = await getAddressesByLabelAsync(label);
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
const addresses = Object.keys(addressesByLabel);
|
|
36
|
+
|
|
37
|
+
if (addresses.length === 0) {
|
|
38
|
+
console.log('No addresses found in the wallet.');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
console.log(`Found ${addresses.length} addresses in the wallet.`);
|
|
43
|
+
|
|
44
|
+
// Loop over each address and fetch its UTXOs
|
|
45
|
+
for (let address of addresses) {
|
|
46
|
+
console.log(`Fetching UTXOs for address: ${address}`);
|
|
47
|
+
|
|
48
|
+
const minConfirmations = 1;
|
|
49
|
+
const maxConfirmations = 9999999;
|
|
50
|
+
const utxos = await listUnspentAsync(minConfirmations, maxConfirmations, [address]);
|
|
51
|
+
|
|
52
|
+
if (utxos && utxos.length > 0) {
|
|
53
|
+
console.log(`UTXOs for ${address}:`, utxos);
|
|
54
|
+
} else {
|
|
55
|
+
console.log(`No UTXOs available for address: ${address}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const mempool = await getMempool(true)
|
|
59
|
+
console.log('checking mempool '+JSON.stringify(mempool))
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error('Error fetching addresses or UTXOs:', error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Execute the function to list unspent outputs for all addresses in the wallet
|
|
66
|
+
listUnspentForAllAddresses();
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const litecoin = require('litecoin');
|
|
2
|
+
|
|
3
|
+
class LitecoinClient {
|
|
4
|
+
static instance;
|
|
5
|
+
|
|
6
|
+
constructor() {
|
|
7
|
+
if (LitecoinClient.instance) {
|
|
8
|
+
return LitecoinClient.instance;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
this.client = new litecoin.Client({
|
|
12
|
+
host: '127.0.0.1',
|
|
13
|
+
port: 18332, //for testnet
|
|
14
|
+
user: 'user',
|
|
15
|
+
pass: 'pass',
|
|
16
|
+
timeout: 10000
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
LitecoinClient.instance = this;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static getInstance() {
|
|
23
|
+
if (!LitecoinClient.instance) {
|
|
24
|
+
new LitecoinClient();
|
|
25
|
+
}
|
|
26
|
+
return LitecoinClient.instance.client;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = LitecoinClient;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const Litecoin = require('litecoin');
|
|
2
|
+
const async = require('async')
|
|
3
|
+
const util = require('util');
|
|
4
|
+
|
|
5
|
+
const client = new Litecoin.Client({
|
|
6
|
+
host: '127.0.0.1',
|
|
7
|
+
port: 18332,
|
|
8
|
+
user: 'user',
|
|
9
|
+
pass: 'pass',
|
|
10
|
+
timeout: 1000
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const loadWalletAsync = util.promisify(client.cmd.bind(client, 'loadwallet'))
|
|
15
|
+
async function load(){
|
|
16
|
+
|
|
17
|
+
const loadwallet = await loadWalletAsync(''/*wallet.dat'*/)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
load()
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
const litecoin = require('litecoin');
|
|
2
|
+
const axios = require('axios');
|
|
3
|
+
const util = require('util');
|
|
4
|
+
const litecore = require('bitcore-lib-ltc');
|
|
5
|
+
const encoder = require('../src/txEncoder.js');
|
|
6
|
+
|
|
7
|
+
const clientConfig = {
|
|
8
|
+
host: '127.0.0.1',
|
|
9
|
+
port: 18332, // Testnet RPC port
|
|
10
|
+
user: 'user',
|
|
11
|
+
pass: 'pass',
|
|
12
|
+
timeout: 10000
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const client = new litecoin.Client(clientConfig);
|
|
16
|
+
|
|
17
|
+
// Promisify necessary RPC commands
|
|
18
|
+
const listUnspentAsync = util.promisify(client.cmd.bind(client, 'listunspent'));
|
|
19
|
+
const dumpPrivKeyAsync = util.promisify(client.cmd.bind(client, 'dumpprivkey'));
|
|
20
|
+
const sendrawtransactionAsync = util.promisify(client.cmd.bind(client, 'sendrawtransaction'));
|
|
21
|
+
|
|
22
|
+
const LTC_PRICE_API_URL = 'https://api.coingecko.com/api/v3/simple/price?ids=litecoin&vs_currencies=usd';
|
|
23
|
+
|
|
24
|
+
//'https://api.coingecko.com/api/v3/simple/price?ids=litecoin&vs_currencies=usd';
|
|
25
|
+
|
|
26
|
+
// Fetch the BTC price
|
|
27
|
+
async function fetchBTCPrice() {
|
|
28
|
+
try {
|
|
29
|
+
const response = await axios.get(LTC_PRICE_API_URL);
|
|
30
|
+
const price = response.data.litecoin.usd;
|
|
31
|
+
console.log('Fetched BTC Price:', price);
|
|
32
|
+
return price;
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error('Error fetching BTC price:', error.message);
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Build, sign, and send the transaction
|
|
40
|
+
async function buildSignAndSendTransaction(fromAddress, btcPrice) {
|
|
41
|
+
try {
|
|
42
|
+
console.log('Preparing transaction with BTC Price:', btcPrice);
|
|
43
|
+
|
|
44
|
+
// Dump private key and get UTXOs
|
|
45
|
+
const privateKeyWIF = await dumpPrivKeyAsync(fromAddress);
|
|
46
|
+
const privateKey = litecore.PrivateKey.fromWIF(privateKeyWIF);
|
|
47
|
+
const unspentOutputs = await listUnspentAsync(0, 9999999, [fromAddress]);
|
|
48
|
+
console.log('unspent '+JSON.stringify(unspentOutputs))
|
|
49
|
+
if (!unspentOutputs.length) throw new Error('No unspent outputs available.');
|
|
50
|
+
|
|
51
|
+
// Select the largest UTXO
|
|
52
|
+
const largestUTXO = unspentOutputs.reduce((prev, curr) => prev.amount > curr.amount ? prev : curr);
|
|
53
|
+
console.log('Using UTXO:', largestUTXO);
|
|
54
|
+
if(largestUTXO.spendable==true){
|
|
55
|
+
const utxo = {
|
|
56
|
+
txId: largestUTXO.txid,
|
|
57
|
+
outputIndex: largestUTXO.vout,
|
|
58
|
+
script: largestUTXO.scriptPubKey,
|
|
59
|
+
satoshis: Math.floor(largestUTXO.amount * 1e8)
|
|
60
|
+
};
|
|
61
|
+
}else{
|
|
62
|
+
const utxo = unspentOutputs
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
// Create the payload
|
|
67
|
+
const params = {
|
|
68
|
+
oracleid: 2,
|
|
69
|
+
price: 142,//btcPrice,
|
|
70
|
+
targetAddress: fromAddress
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const payload = encoder.encodePublishOracleData(params);
|
|
74
|
+
|
|
75
|
+
// Create and sign the transaction
|
|
76
|
+
const transaction = new litecore.Transaction()
|
|
77
|
+
.from(largestUTXO) // Add UTXO as input
|
|
78
|
+
.addOutput(new litecore.Transaction.Output({
|
|
79
|
+
satoshis: 0, // OP_RETURN fee
|
|
80
|
+
script: litecore.Script.buildDataOut(payload) // Embed payload in OP_RETURN
|
|
81
|
+
}))
|
|
82
|
+
.change(fromAddress) // Send change back to sender
|
|
83
|
+
.sign(privateKey); // Sign transaction
|
|
84
|
+
|
|
85
|
+
console.log('Raw Transaction Hex:', transaction.toString());
|
|
86
|
+
|
|
87
|
+
// Broadcast the transaction
|
|
88
|
+
const txid = await sendrawtransactionAsync(transaction.serialize());
|
|
89
|
+
console.log(`Transaction broadcasted successfully. TXID: ${txid}`);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
console.error('Error building/signing transaction:', error.message);
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Main function to fetch BTC price and send the attestation
|
|
97
|
+
async function publishBTCPrice() {
|
|
98
|
+
try {
|
|
99
|
+
const fromAddress = 'tltc1qa0kd2d39nmeph3hvcx8ytv65ztcywg5sazhtw8'; // Admin address
|
|
100
|
+
const btcPrice = await fetchBTCPrice();
|
|
101
|
+
await buildSignAndSendTransaction(fromAddress, btcPrice);
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.error('Failed to publish BTC price:', error.message);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
publishBTCPrice()
|
|
108
|
+
|
|
109
|
+
// Run the attestation script every 150 seconds
|
|
110
|
+
setInterval(() => {
|
|
111
|
+
console.log('Starting BTC price publish cycle...');
|
|
112
|
+
publishBTCPrice();
|
|
113
|
+
}, 150 * 1000); // 150 seconds in milliseconds
|