mirror of
https://github.com/Permissionless-Software-Foundation/bch-js.git
synced 2026-09-22 09:02:01 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eae7172e3d | ||
|
|
6dd2a0590f | ||
|
|
3152e87b5d | ||
|
|
4b66f3841d | ||
|
|
9f98a47682 | ||
|
|
0833e8ca78 | ||
|
|
e01a18b65e | ||
|
|
055cd7feca | ||
|
|
906d9b2094 | ||
|
|
9326fd6e59 | ||
|
|
1d91eed5df |
Generated
+7612
-7636
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -19,7 +19,7 @@
|
||||
"test:integration:local:bchn": "export RESTURL=http://localhost:3000/v5/ && mocha --timeout 30000 test/integration/ && mocha --timeout 30000 test/integration/chains/bchn/",
|
||||
"test:integration:local:testnet": "RESTURL=http://localhost:4000/v5/ mocha --timeout 30000 test/integration/chains/testnet",
|
||||
"test:integration:decatur:bchn": "export RESTURL=http://192.168.2.129:3000/v5/ && mocha --timeout 30000 test/integration/ && mocha --timeout 30000 test/integration/chains/bchn/",
|
||||
"test:integration:decatur:abc": "export RESTURL=http://192.168.2.141:3000/v5/ && mocha --timeout 30000 test/integration && mocha --timeout 30000 test/integration/chains/abc/",
|
||||
"test:integration:decatur:abc": "export RESTURL=http://192.168.2.142:3000/v5/ && mocha --timeout 30000 test/integration && mocha --timeout 30000 test/integration/chains/abc/",
|
||||
"test:integration:temp:bchn": "export RESTURL=http://157.90.174.219:3000/v5/ && mocha --timeout 30000 test/integration/",
|
||||
"test:temp": "export RESTURL=http://localhost:3000/v5/ && mocha --timeout 30000 -g '#Encryption' test/integration/",
|
||||
"test:temp2": "mocha --timeout=30000 -g '#TransactionLib' test/unit/",
|
||||
@@ -40,7 +40,7 @@
|
||||
"@chris.troutner/bip32-utils": "1.0.5",
|
||||
"@psf/bip21": "2.0.1",
|
||||
"@psf/bitcoincash-ops": "2.0.0",
|
||||
"@psf/bitcoincashjs-lib": "4.0.2",
|
||||
"@psf/bitcoincashjs-lib": "4.0.3",
|
||||
"@psf/coininfo": "4.0.0",
|
||||
"axios": "0.26.1",
|
||||
"bc-bip68": "1.0.5",
|
||||
|
||||
@@ -32,6 +32,28 @@ class Encryption {
|
||||
_this = this
|
||||
}
|
||||
|
||||
/**
|
||||
* @api encryption.getPubKey() getPubKey()
|
||||
* @apiName Encryption getPubKey()
|
||||
* @apiGroup Encryption
|
||||
* @apiDescription Get the public key for an address
|
||||
* Given an address, the command will search the blockchain for a public
|
||||
* key associated with that address. The address needs to have made at least
|
||||
* one spend transaction, in order for its public key to be retrievable.
|
||||
*
|
||||
* @apiExample Example usage:
|
||||
*(async () => {
|
||||
* try {
|
||||
* const addr = 'bitcoincash:qqlrzp23w08434twmvr4fxw672whkjy0py26r63g3d'
|
||||
* const pubkey = await bchjs.encryption.getPubKey(addr);
|
||||
* console.log(pubkey);
|
||||
* } catch(err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
*})()
|
||||
*
|
||||
*/
|
||||
|
||||
// Search the blockchain for a public key associated with a BCH address.
|
||||
async getPubKey (addr) {
|
||||
try {
|
||||
|
||||
@@ -514,7 +514,7 @@ class PsfSlpIndexer {
|
||||
* }
|
||||
*
|
||||
*/
|
||||
async getTokenData2 (tokenId) {
|
||||
async getTokenData2 (tokenId, updateCache = false) {
|
||||
try {
|
||||
const url = `${this.restURL}psf/slp/token/data2`
|
||||
// console.log(`url: ${url}`)
|
||||
@@ -524,7 +524,7 @@ class PsfSlpIndexer {
|
||||
const response = await axios.post(
|
||||
// 'https://bchn.fullstack.cash/v5/psf/slp/token/data/',
|
||||
url,
|
||||
{ tokenId },
|
||||
{ tokenId, updateCache },
|
||||
this.axiosOptions
|
||||
)
|
||||
return response.data
|
||||
|
||||
+14
@@ -109,6 +109,11 @@ class UTXO {
|
||||
}
|
||||
}
|
||||
|
||||
// Get the sync status of the SLP indexer
|
||||
const syncStatus = await this.psfSlpIndexer.status()
|
||||
const slpIndexerHeight = syncStatus.status.syncedBlockHeight
|
||||
const chainBlockHeight = syncStatus.status.chainBlockHeight
|
||||
|
||||
// Loop through the Fulcrum UTXOs.
|
||||
for (let i = 0; i < utxos.length; i++) {
|
||||
const thisUtxo = utxos[i]
|
||||
@@ -152,6 +157,15 @@ class UTXO {
|
||||
thisUtxo.isSlp = false
|
||||
}
|
||||
// console.log(`thisUtxo.isSlp: ${thisUtxo.isSlp}`)
|
||||
|
||||
// If the SLP indexer more than 1 block behind the full node, then
|
||||
// move any BCH UTXOs of 600 sats or less into the null array. This
|
||||
// protects token UTXOs from being burned accidentally.
|
||||
if (slpIndexerHeight < chainBlockHeight - 1) {
|
||||
if (thisUtxo.value < 601) {
|
||||
thisUtxo.isSlp = null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
This test is used to interrogate the behavior of bch-js when a psf-slp-indexer
|
||||
panicks and starts indexing from SLP genesis. In this corner-case, bch-js
|
||||
should detect the indexer is out of sync, and protect any token UTXOs by
|
||||
moving any UTXO under 600 sats into the null array.
|
||||
|
||||
TO RUN THIS TEST:
|
||||
- Reset a local instance of psf-slp-indexer to sync from genesis.
|
||||
- Start a local copy of bch-api
|
||||
*/
|
||||
|
||||
const BCHJS = require('../../../src/bch-js.js')
|
||||
const bchjs = new BCHJS({
|
||||
restURL: 'http://localhost:3000/v5/'
|
||||
})
|
||||
|
||||
async function startTest () {
|
||||
try {
|
||||
const addr = 'bitcoincash:qzkvas58zag9tjry693mflkjze2m20ps7vx7uw7z9d'
|
||||
|
||||
const result = await bchjs.Utxo.get(addr)
|
||||
console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
||||
} catch (err) {
|
||||
console.error('Error in startTest(): ', err)
|
||||
}
|
||||
}
|
||||
startTest()
|
||||
@@ -126,7 +126,7 @@ describe('#UTXO', () => {
|
||||
describe('#isValid', () => {
|
||||
it('should return true for valid UTXO with fullnode properties', async () => {
|
||||
const utxo = {
|
||||
txid: 'b94e1ff82eb5781f98296f0af2488ff06202f12ee92b0175963b8dba688d1b40',
|
||||
txid: '260d4fb4006a330660c805327c840d569d7547b7e3e9659fb423b3a041c2e254',
|
||||
vout: 0
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ describe('#UTXO', () => {
|
||||
|
||||
it('should return true for valid UTXO with fulcrum properties', async () => {
|
||||
const utxo = {
|
||||
tx_hash: 'b94e1ff82eb5781f98296f0af2488ff06202f12ee92b0175963b8dba688d1b40',
|
||||
tx_hash: '260d4fb4006a330660c805327c840d569d7547b7e3e9659fb423b3a041c2e254',
|
||||
tx_pos: 0
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ describe('#UTXO', () => {
|
||||
})
|
||||
|
||||
it('should process output of Utxo.get()', async () => {
|
||||
const utxo = await bchjs.Utxo.get('bitcoincash:qr4yscpw9jgq8ltajfeknpj32kamkf9knujffcdhyq')
|
||||
const utxo = await bchjs.Utxo.get('bitcoincash:qqgahqa5zkknmhmvsc98jndpwn3r77gqgc02x03jce')
|
||||
// console.log(`utxo: ${JSON.stringify(utxo, null, 2)}`)
|
||||
|
||||
const result = await bchjs.Utxo.isValid(utxo.bchUtxos[0])
|
||||
|
||||
@@ -121,6 +121,8 @@ describe('#utxo', () => {
|
||||
sandbox
|
||||
.stub(bchjs.Utxo.psfSlpIndexer, 'tx')
|
||||
.resolves({ txData: { isValidSlp: false } })
|
||||
sandbox.stub(bchjs.Utxo.psfSlpIndexer, 'status')
|
||||
.resolves({ status: { syncedBlockHeight: 600000, chainBlockHeight: 600000 } })
|
||||
|
||||
// Mock function to return the same input. Good enough for this test.
|
||||
sandbox.stub(bchjs.Utxo, 'hydrateTokenData').resolves(x => x)
|
||||
@@ -154,6 +156,8 @@ describe('#utxo', () => {
|
||||
sandbox
|
||||
.stub(bchjs.Utxo.psfSlpIndexer, 'tx')
|
||||
.resolves({ txData: { isValidSlp: false } })
|
||||
sandbox.stub(bchjs.Utxo.psfSlpIndexer, 'status')
|
||||
.resolves({ status: { syncedBlockHeight: 600000, chainBlockHeight: 600000 } })
|
||||
|
||||
// Force psf-slp-indexer to return no UTXOs
|
||||
sandbox
|
||||
|
||||
Reference in New Issue
Block a user