mirror of
https://github.com/Permissionless-Software-Foundation/bch-js.git
synced 2026-09-22 00:52:01 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
054fb9c14e | ||
|
|
1fd4095dcb | ||
|
|
0eb1f74ba1 | ||
|
|
1a13c41c22 | ||
|
|
8b6952b1d4 | ||
|
|
73dd2c010d |
+1
-1
@@ -15,7 +15,7 @@
|
||||
"test:integration:testnet:local": "RESTURL=http://localhost:4000/v3/ mocha --timeout 30000 test/integration/testnet",
|
||||
"test:integration:free": "bash test/integration/test-free-tier.sh",
|
||||
"test:integration:free:testnet": "bash test/integration/testnet/test-free-tier.sh",
|
||||
"test:temp": "mocha --timeout 30000 test/integration/slp.js",
|
||||
"test:temp": "mocha --timeout 30000 -g '#hydrateUtxos' test/integration/slp.js",
|
||||
"test:integration:api": "RESTURL=https://api.fullstack.cash/v3/ mocha --timeout 30000 test/integration",
|
||||
"coverage": "nyc report --reporter=text-lcov | coveralls",
|
||||
"coverage:report": "nyc --reporter=html mocha --timeout 25000 test/unit/",
|
||||
|
||||
+54
-12
@@ -748,6 +748,7 @@ class Utils {
|
||||
|
||||
return tokenData
|
||||
} catch (error) {
|
||||
// console.log('decodeOpReturn error: ', error)
|
||||
if (error.response && error.response.data) throw error.response.data
|
||||
throw error
|
||||
}
|
||||
@@ -766,14 +767,16 @@ class Utils {
|
||||
* set to false.
|
||||
* If the UTXO is part of an SLP transaction, it will return the UTXO object
|
||||
* with additional SLP information attached. An `isValid` property will be included.
|
||||
* If its value is true, the UTXO is a valid SLP UTXO. If the value is null,
|
||||
* then SLPDB has not yet processed that txid and validity has not been confirmed.
|
||||
* If its value is true, the UTXO is a valid SLP UTXO.
|
||||
* If the isValid value is null,
|
||||
* then SLPDB has not yet processed that txid and validity has not been confirmed,
|
||||
* or a 429 rate-limit error was enountered during the processing of the request.
|
||||
*
|
||||
* @apiExample Example usage:
|
||||
*
|
||||
* (async () => {
|
||||
* try {
|
||||
* const utxos = await bchjs.Blockbook.utxos(`bitcoincash:qpcqs0n5xap26un2828n55gan2ylj7wavvzeuwdx05`)
|
||||
* const utxos = await bchjs.Electrumx.utxo(`bitcoincash:qpcqs0n5xap26un2828n55gan2ylj7wavvzeuwdx05`)
|
||||
*
|
||||
* const utxoInfo = await bchjs.SLP.Utils.tokenUtxoDetails(utxos)
|
||||
*
|
||||
@@ -870,12 +873,29 @@ class Utils {
|
||||
slpData = await this.decodeOpReturn(utxo.txid)
|
||||
// console.log(`slpData: ${JSON.stringify(slpData, null, 2)}`)
|
||||
} catch (err) {
|
||||
// console.log(`error: `, err)
|
||||
// console.log(`error from decodeOpReturn(${utxo.txid}): `, err)
|
||||
|
||||
// An error will be thrown if the txid is not SLP.
|
||||
// Mark as false and continue the loop.
|
||||
// outAry.push(false)
|
||||
utxo.isValid = false
|
||||
outAry.push(utxo)
|
||||
// If error is for some other reason, like a 429 error, mark utxo as 'null'
|
||||
// to display the unknown state.
|
||||
if (
|
||||
!err.message ||
|
||||
err.message.indexOf("scriptpubkey not op_return") === -1
|
||||
) {
|
||||
// console.log(`error from decodeOpReturn(${utxo.txid}): `, err)
|
||||
|
||||
utxo.isValid = null
|
||||
outAry.push(utxo)
|
||||
|
||||
// If error is thrown because there is no OP_RETURN, then it's not
|
||||
// an SLP UTXO.
|
||||
// Mark as false and continue the loop.
|
||||
} else {
|
||||
utxo.isValid = false
|
||||
outAry.push(utxo)
|
||||
}
|
||||
|
||||
// Halt the execution of the loop and increase to the next index.
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -1040,8 +1060,10 @@ class Utils {
|
||||
* set to false.
|
||||
* If the UTXO is part of an SLP transaction, it will return the UTXO object
|
||||
* with additional SLP information attached. An `isValid` property will be included.
|
||||
* If its value is true, the UTXO is a valid SLP UTXO. If the value is null,
|
||||
* then SLPDB has not yet processed that txid and validity has not been confirmed.
|
||||
* If its value is true, the UTXO is a valid SLP UTXO. \
|
||||
* If the isValid value is null,
|
||||
* then SLPDB has not yet processed that txid and validity has not been confirmed,
|
||||
* or a 429 rate-limit error was enountered during the processing of the request.
|
||||
*
|
||||
* @apiExample Example usage:
|
||||
*
|
||||
@@ -1089,7 +1111,17 @@ class Utils {
|
||||
* "satoshis": 546,
|
||||
* "txid": "8ec01d851d9df9fb4b4331275e2ff680257c224100d0081cec6fbeedf982f738",
|
||||
* "vout": 1,
|
||||
* "isValid": false
|
||||
* "utxoType": "token",
|
||||
* "transactionType": "send",
|
||||
* "tokenId": "a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2",
|
||||
* "tokenTicker": "TROUT",
|
||||
* "tokenName": "Trout's test token",
|
||||
* "tokenDocumentUrl": "troutsblog.com",
|
||||
* "tokenDocumentHash": "",
|
||||
* "decimals": 2,
|
||||
* "tokenType": 1,
|
||||
* "tokenQty": 10,
|
||||
* "isValid": true
|
||||
* }
|
||||
* ],
|
||||
* "address": "bitcoincash:qpjdrs8qruzh8xvusdfmutjx62awcepnhyperm3g89"
|
||||
@@ -1114,7 +1146,17 @@ class Utils {
|
||||
* "satoshis": 546,
|
||||
* "txid": "a72db6a0883ecb8e379f317231b2571e41e041b7b1107e3e54c2e0b3386ac6ca",
|
||||
* "vout": 1,
|
||||
* "isValid": false
|
||||
* "utxoType": "token",
|
||||
* "transactionType": "send",
|
||||
* "tokenId": "6201f3efe486c577433622817b99645e1d473cd3882378f9a0efc128ab839a82",
|
||||
* "tokenTicker": "VALENTINE",
|
||||
* "tokenName": "Valentine day token",
|
||||
* "tokenDocumentUrl": "fullstack.cash",
|
||||
* "tokenDocumentHash": "",
|
||||
* "decimals": 2,
|
||||
* "tokenType": 1,
|
||||
* "tokenQty": 5,
|
||||
* "isValid": true
|
||||
* }
|
||||
* ],
|
||||
* "address": "bitcoincash:qzygn28zpgeemnptkn26xzyuzzfu9l8f9vfvq7kptk"
|
||||
|
||||
@@ -590,6 +590,21 @@ describe(`#SLP`, () => {
|
||||
assert.equal(result.slpUtxos[0].utxos.length, 1)
|
||||
assert.equal(result.slpUtxos[1].utxos.length, 1)
|
||||
assert.equal(result.slpUtxos[2].utxos.length, 2)
|
||||
|
||||
try {
|
||||
// Test the expected values.
|
||||
assert.equal(result.slpUtxos[0].utxos[0].isValid, false)
|
||||
assert.equal(result.slpUtxos[1].utxos[0].isValid, true)
|
||||
assert.equal(result.slpUtxos[1].utxos[0].tokenTicker, "TROUT")
|
||||
assert.equal(result.slpUtxos[2].utxos[0].isValid, false)
|
||||
assert.equal(result.slpUtxos[2].utxos[1].isValid, true)
|
||||
assert.equal(result.slpUtxos[2].utxos[1].tokenTicker, "VALENTINE")
|
||||
} catch (err) {
|
||||
console.error(
|
||||
'The hydrateUtxos call may hitting rate limits, or SLPDB may be having issues if "isValid" results are "null"'
|
||||
)
|
||||
console.log("Error: ", err)
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1695,6 +1695,46 @@ describe("#SLP Utils", () => {
|
||||
|
||||
assert2.equal(data[2].isValid, false)
|
||||
})
|
||||
|
||||
it("should return null value when 429 recieved", async () => {
|
||||
const utxos = [
|
||||
{
|
||||
height: 654522,
|
||||
tx_hash:
|
||||
"072a1e2c2d5f1309bf4eef7f88684e4ecd544a903b386b07f3e04b91b13d8af1",
|
||||
tx_pos: 0,
|
||||
value: 6999,
|
||||
satoshis: 6999,
|
||||
txid:
|
||||
"072a1e2c2d5f1309bf4eef7f88684e4ecd544a903b386b07f3e04b91b13d8af1",
|
||||
vout: 0
|
||||
},
|
||||
{
|
||||
height: 654522,
|
||||
tx_hash:
|
||||
"a72db6a0883ecb8e379f317231b2571e41e041b7b1107e3e54c2e0b3386ac6ca",
|
||||
tx_pos: 1,
|
||||
value: 546,
|
||||
satoshis: 546,
|
||||
txid:
|
||||
"a72db6a0883ecb8e379f317231b2571e41e041b7b1107e3e54c2e0b3386ac6ca",
|
||||
vout: 1
|
||||
}
|
||||
]
|
||||
|
||||
sandbox.stub(slp.Utils, "decodeOpReturn").rejects({
|
||||
error:
|
||||
"Too many requests. Your limits are currently 3 requests per minute. Increase rate limits at https://fullstack.cash"
|
||||
})
|
||||
|
||||
const data = await slp.Utils.tokenUtxoDetails(utxos)
|
||||
// console.log(`data: ${JSON.stringify(data, null, 2)}`)
|
||||
|
||||
// Values should be 'null' to signal that a determination could not be made
|
||||
// due to a throttling issue.
|
||||
assert.equal(data[0].isValid, null)
|
||||
assert.equal(data[1].isValid, null)
|
||||
})
|
||||
})
|
||||
|
||||
describe("#txDetails", () => {
|
||||
|
||||
Reference in New Issue
Block a user