@psf/bch-js 6.4.4 → 6.5.0
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/package.json +2 -2
- package/src/price.js +13 -13
- package/src/psf-slp-indexer.js +85 -1
- package/test/integration/chains/bchn/psf-slp-indexer.integration.js +30 -0
- package/test/integration/price.js +9 -8
- package/test/unit/fixtures/psf-slp-indexer-mock.js +55 -1
- package/test/unit/price.js +12 -12
- package/test/unit/psf-slp-indexer.js +24 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@psf/bch-js",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.5.0",
|
|
4
4
|
"description": "A JavaScript library for working with Bitcoin Cash, eCash, and SLP Tokens",
|
|
5
5
|
"author": "Chris Troutner <chris.troutner@gmail.com>",
|
|
6
6
|
"contributors": [
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"test": "nyc mocha --trace-warnings --unhandled-rejections=strict --timeout 30000 test/unit/",
|
|
13
13
|
"test:integration": "npm run test:integration:bchn",
|
|
14
14
|
"test:integration:nft": "export RESTURL=https://bchn.fullstack.cash/v5/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 -g '#nft1' test/integration/chains/bchn/slp.js",
|
|
15
|
-
"test:integration:abc": "export RESTURL=https://abc.fullstack.cash/v5/ &&
|
|
15
|
+
"test:integration:abc": "export RESTURL=https://abc.fullstack.cash/v5/ && mocha --timeout 30000 test/integration/ && mocha --timeout 30000 test/integration/chains/abc/",
|
|
16
16
|
"test:integration:bchn": "export RESTURL=https://bchn.fullstack.cash/v5/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 test/integration/ && mocha --timeout 30000 test/integration/chains/bchn/",
|
|
17
17
|
"test:integration:bchn:slpdb": "export TESTSLP=1 && export RESTURL=https://bchn.fullstack.cash/v5/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 test/integration/ && mocha --timeout 30000 test/integration/chains/bchn/",
|
|
18
18
|
"test:integration:local:abc": "export RESTURL=http://localhost:3000/v5/ && mocha --timeout 30000 test/integration && mocha --timeout 30000 test/integration/chains/abc/",
|
package/src/price.js
CHANGED
|
@@ -30,19 +30,19 @@ class Price {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
// This endpoint is deprecated. Documentation removed.
|
|
33
|
-
async current (currency = 'usd') {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
33
|
+
// async current (currency = 'usd') {
|
|
34
|
+
// try {
|
|
35
|
+
// const response = await this.axios.get(
|
|
36
|
+
// `https://index-api.bitcoin.com/api/v0/cash/price/${currency.toLowerCase()}`
|
|
37
|
+
// )
|
|
38
|
+
// // console.log(`response.data: ${JSON.stringify(response.data, null, 2)}`)
|
|
39
|
+
//
|
|
40
|
+
// return response.data.price
|
|
41
|
+
// } catch (err) {
|
|
42
|
+
// if (err.response && err.response.data) throw err.response.data
|
|
43
|
+
// else throw err
|
|
44
|
+
// }
|
|
45
|
+
// }
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* @api price.getUsd() getUsd()
|
package/src/psf-slp-indexer.js
CHANGED
|
@@ -194,6 +194,7 @@ class PsfSlpIndexer {
|
|
|
194
194
|
* }
|
|
195
195
|
* }
|
|
196
196
|
*
|
|
197
|
+
*
|
|
197
198
|
*/
|
|
198
199
|
|
|
199
200
|
async tokenStats (tokenId, withTxHistory = false) {
|
|
@@ -420,11 +421,92 @@ class PsfSlpIndexer {
|
|
|
420
421
|
* }
|
|
421
422
|
*
|
|
422
423
|
*/
|
|
423
|
-
async getTokenData (tokenId) {
|
|
424
|
+
async getTokenData (tokenId, withTxHistory = false) {
|
|
424
425
|
try {
|
|
425
426
|
const url = `${this.restURL}psf/slp/token/data`
|
|
426
427
|
// console.log(`url: ${url}`)
|
|
427
428
|
|
|
429
|
+
// Handle single address.
|
|
430
|
+
if (typeof tokenId === 'string') {
|
|
431
|
+
const response = await axios.post(
|
|
432
|
+
// 'https://bchn.fullstack.cash/v5/psf/slp/token/data/',
|
|
433
|
+
url,
|
|
434
|
+
{ tokenId, withTxHistory },
|
|
435
|
+
this.axiosOptions
|
|
436
|
+
)
|
|
437
|
+
return response.data
|
|
438
|
+
}
|
|
439
|
+
throw new Error('Input tokenId must be a string.')
|
|
440
|
+
} catch (error) {
|
|
441
|
+
if (error.response && error.response.data) throw error.response.data
|
|
442
|
+
else throw error
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* @api PsfSlpIndexer.getTokenData2() getTokenData2()
|
|
448
|
+
* @apiName Token Data
|
|
449
|
+
* @apiGroup PSF SLP
|
|
450
|
+
* @apiDescription Get token icon and other media associated with a token.
|
|
451
|
+
*
|
|
452
|
+
* @apiExample Example usage:
|
|
453
|
+
* (async () => {
|
|
454
|
+
* try {
|
|
455
|
+
* let tokenData = await bchjs.PsfSlpIndexer.getTokenData2('a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2')
|
|
456
|
+
* console.log(tokenData)
|
|
457
|
+
* } catch(error) {
|
|
458
|
+
* console.error(error)
|
|
459
|
+
* }
|
|
460
|
+
* })()
|
|
461
|
+
*
|
|
462
|
+
* {
|
|
463
|
+
* tokenStats: {
|
|
464
|
+
* type: 1,
|
|
465
|
+
* ticker: 'CTAIA006',
|
|
466
|
+
* name: 'CTAIA006 - AI Art by Chris Troutner',
|
|
467
|
+
* tokenId: '0e4543f820699294ab57e02ee2b1815a8bbc7b17a4333e4a138034e4b2324a61',
|
|
468
|
+
* documentUri: 'ipfs://bafybeia5yuq7rg6jmwquako7t277cwrobcunz7cumqrv4wn6bgfvthemku',
|
|
469
|
+
* documentHash: '78a00e9db312b8fff4e5c37cf592be83e6bab7f3bd5a54c9545bad5d4f3ee0f5',
|
|
470
|
+
* decimals: 0,
|
|
471
|
+
* mintBatonIsActive: false,
|
|
472
|
+
* tokensInCirculationBN: '1',
|
|
473
|
+
* tokensInCirculationStr: '1',
|
|
474
|
+
* blockCreated: 757507,
|
|
475
|
+
* totalBurned: '0',
|
|
476
|
+
* totalMinted: '1'
|
|
477
|
+
* },
|
|
478
|
+
* mutableData: {
|
|
479
|
+
* tokenIcon: 'https://bafybeihiv5jvlhoymmbous3h2akotogj6b7hruhjcj3zq7dsfteimuuttm.ipfs.w3s.link/whale-night-sky-01.png',
|
|
480
|
+
* fullSizedUrl: '',
|
|
481
|
+
* about: 'This NFT was created using the PSF Token Studio at https://nft-creator.fullstack.cash',
|
|
482
|
+
* userData: ''
|
|
483
|
+
* },
|
|
484
|
+
* immutableData: {
|
|
485
|
+
* issuer: 'http://psfoundation.cash',
|
|
486
|
+
* website: 'https://nft-creator.fullstack.cash',
|
|
487
|
+
* dateCreated: '9/12/2022, 5:17:38 PM',
|
|
488
|
+
* userData: '{\n' +
|
|
489
|
+
* ' "title": "CTAIA006 - AI Art by Chris Troutner",\n' +
|
|
490
|
+
* ' "about": "AI generated art. Generated from DALL-E at https://labs.openai.com",\n' +
|
|
491
|
+
* ' "prompt": "whale swimming through a sky full of stars",\n' +
|
|
492
|
+
* ' "algorithm": "DALL-E (stable diffusion)",\n' +
|
|
493
|
+
* ' "set": "1-of-2"\n' +
|
|
494
|
+
* '}'
|
|
495
|
+
* },
|
|
496
|
+
* tokenIcon: 'https://bafybeihiv5jvlhoymmbous3h2akotogj6b7hruhjcj3zq7dsfteimuuttm.ipfs.w3s.link/whale-night-sky-01.png',
|
|
497
|
+
* fullSizedUrl: '',
|
|
498
|
+
* optimizedTokenIcon: 'https://p2wdb-gateway-678.fullstack.cash/ipfs/bafybeihiv5jvlhoymmbous3h2akotogj6b7hruhjcj3zq7dsfteimuuttm/whale-night-sky-01.png',
|
|
499
|
+
* optimizedFullSizedUrl: '',
|
|
500
|
+
* iconRepoCompatible: false,
|
|
501
|
+
* ps002Compatible: true
|
|
502
|
+
* }
|
|
503
|
+
*
|
|
504
|
+
*/
|
|
505
|
+
async getTokenData2 (tokenId) {
|
|
506
|
+
try {
|
|
507
|
+
const url = `${this.restURL}psf/slp/token/data2`
|
|
508
|
+
// console.log(`url: ${url}`)
|
|
509
|
+
|
|
428
510
|
// Handle single address.
|
|
429
511
|
if (typeof tokenId === 'string') {
|
|
430
512
|
const response = await axios.post(
|
|
@@ -435,8 +517,10 @@ class PsfSlpIndexer {
|
|
|
435
517
|
)
|
|
436
518
|
return response.data
|
|
437
519
|
}
|
|
520
|
+
|
|
438
521
|
throw new Error('Input tokenId must be a string.')
|
|
439
522
|
} catch (error) {
|
|
523
|
+
console.log('error: ', error)
|
|
440
524
|
if (error.response && error.response.data) throw error.response.data
|
|
441
525
|
else throw error
|
|
442
526
|
}
|
|
@@ -145,6 +145,36 @@ describe('#psf-slp-indexer', () => {
|
|
|
145
145
|
assert.isString(result.immutableData)
|
|
146
146
|
assert.isString(result.mutableData)
|
|
147
147
|
})
|
|
148
|
+
|
|
149
|
+
it('should get token data with a transaction history', async () => {
|
|
150
|
+
const tokenId = '43eddfb11c9941edffb8c8815574bb0a43969a7b1de39ad14cd043eaa24fd38d'
|
|
151
|
+
|
|
152
|
+
const result = await bchjs.PsfSlpIndexer.getTokenData(tokenId, true)
|
|
153
|
+
// console.log('result: ', result)
|
|
154
|
+
|
|
155
|
+
assert.isArray(result.genesisData.txs)
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
describe('#getTokenData2', () => {
|
|
160
|
+
it('should get token data', async () => {
|
|
161
|
+
const tokenId =
|
|
162
|
+
'd9aafa7acb514c597caf440ae268b5e4e955f2687e05f044cdf8fd9550d9a27b'
|
|
163
|
+
|
|
164
|
+
// bchjs.PsfSlpIndexer.restURL = 'http://localhost:3000/v5/'
|
|
165
|
+
const result = await bchjs.PsfSlpIndexer.getTokenData2(tokenId)
|
|
166
|
+
console.log('result: ', result)
|
|
167
|
+
|
|
168
|
+
assert.property(result, 'tokenStats')
|
|
169
|
+
assert.property(result, 'mutableData')
|
|
170
|
+
assert.property(result, 'immutableData')
|
|
171
|
+
assert.property(result, 'tokenIcon')
|
|
172
|
+
assert.property(result, 'fullSizedUrl')
|
|
173
|
+
assert.property(result, 'optimizedTokenIcon')
|
|
174
|
+
assert.property(result, 'optimizedFullSizedUrl')
|
|
175
|
+
assert.property(result, 'iconRepoCompatible')
|
|
176
|
+
assert.property(result, 'ps002Compatible')
|
|
177
|
+
})
|
|
148
178
|
})
|
|
149
179
|
})
|
|
150
180
|
|
|
@@ -7,14 +7,14 @@ describe('#price', () => {
|
|
|
7
7
|
if (process.env.IS_USING_FREE_TIER) await sleep(1500)
|
|
8
8
|
})
|
|
9
9
|
|
|
10
|
-
describe('#current', () => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
})
|
|
10
|
+
// describe('#current', () => {
|
|
11
|
+
// describe('#single currency', () => {
|
|
12
|
+
// it('should get current price for single currency', async () => {
|
|
13
|
+
// const result = await bchjs.Price.current('usd')
|
|
14
|
+
// assert.notEqual(0, result)
|
|
15
|
+
// })
|
|
16
|
+
// })
|
|
17
|
+
// })
|
|
18
18
|
|
|
19
19
|
describe('#getUsd', () => {
|
|
20
20
|
it('should get the USD price of BCH', async () => {
|
|
@@ -33,6 +33,7 @@ describe('#price', () => {
|
|
|
33
33
|
assert.isNumber(result)
|
|
34
34
|
})
|
|
35
35
|
})
|
|
36
|
+
|
|
36
37
|
describe('#getBchUsd', () => {
|
|
37
38
|
it('should get the USD price of BCH', async () => {
|
|
38
39
|
const result = await bchjs.Price.getBchUsd()
|
|
@@ -150,11 +150,65 @@ const tokenData = {
|
|
|
150
150
|
mutableData: 'ipfs://bafybeie6t5uyupddc7azms737xg4hxrj7i5t5ov3lb5g2qeehaujj6ak64'
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
+
const tokenMedia01 = {
|
|
154
|
+
tokenStats: {
|
|
155
|
+
type: 65,
|
|
156
|
+
ticker: 'TEST02',
|
|
157
|
+
name: 'How to Send BCH and Tokens',
|
|
158
|
+
tokenId: 'd9aafa7acb514c597caf440ae268b5e4e955f2687e05f044cdf8fd9550d9a27b',
|
|
159
|
+
documentUri: 'ipfs://bafybeigjujbb55wqr5lns7z7vleg5cfp4yjwqp4swisxpgxl4xsp5tngai',
|
|
160
|
+
documentHash: '845f803d8dd3c2b6be94a6cf3a445b54c36f2e01bd5c9ab4c23f37dbd531489e',
|
|
161
|
+
decimals: 0,
|
|
162
|
+
mintBatonIsActive: false,
|
|
163
|
+
tokensInCirculationBN: '0',
|
|
164
|
+
tokensInCirculationStr: '0',
|
|
165
|
+
blockCreated: 740089,
|
|
166
|
+
totalBurned: '1',
|
|
167
|
+
totalMinted: '1',
|
|
168
|
+
parentGroupId: 'c9c425f2c6352697c6665a53e035cbad8a44c4b1e36491a1838dc4655479aa09'
|
|
169
|
+
},
|
|
170
|
+
mutableData: {
|
|
171
|
+
updated: '2022-05-14T15:27:44.429Z',
|
|
172
|
+
tokenIcon: 'https://bafybeiefg3nd5iognbqztkpi5hj34dmwkqfe7v7xeayn2nhhatinmjmzcy.ipfs.dweb.link/send-bch-token-icon.png',
|
|
173
|
+
tokenInfo: 'https://token.fullstack.cash/?tokenid=d9aafa7acb514c597caf440ae268b5e4e955f2687e05f044cdf8fd9550d9a27b',
|
|
174
|
+
description: 'This is an NFT representing a video. This is a test token.',
|
|
175
|
+
issuer: 'Chris Troutner',
|
|
176
|
+
forSale: false,
|
|
177
|
+
display: true,
|
|
178
|
+
currentOwner: {
|
|
179
|
+
bchAddr: 'bitcoincash:qqy7jcrm3vmtqs96r878hy2kx90mn84f25ujqw9z5h',
|
|
180
|
+
name: 'Chris Troutner',
|
|
181
|
+
contactEmail: 'chris.troutner@gmail.com'
|
|
182
|
+
},
|
|
183
|
+
content: {
|
|
184
|
+
youtube: 'https://youtu.be/WZRwkLPtkaI',
|
|
185
|
+
rumble: 'https://rumble.com/v14n00h-how-to-send-bch-and-tokens.html',
|
|
186
|
+
odysee: 'https://odysee.com/@trout:5/how-to-send-bch-tokens:0',
|
|
187
|
+
lbry: 'lbry://@trout#5/how-to-send-bch-tokens#0',
|
|
188
|
+
ipfs: 'bafybeigf3ky5i6fyxwk5bjmtsr6urqmlx4zq2lqathgguytey67iinh4be',
|
|
189
|
+
filecoin: 'https://bafybeigf3ky5i6fyxwk5bjmtsr6urqmlx4zq2lqathgguytey67iinh4be.ipfs.dweb.link/send-bch-2022-02-20_08.22.45.mp4'
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
immutableData: {
|
|
193
|
+
creationDate: '2022-05-13T21:32:11.619Z',
|
|
194
|
+
issuer: 'Chris Troutner',
|
|
195
|
+
license: 'https://bafybeidnkhjfsbihp4gquwqrs6y35jfpcriafymceszwvkundjkwk546pi.ipfs.dweb.link/copyright.txt',
|
|
196
|
+
name: 'How to Send BCH and Tokens'
|
|
197
|
+
},
|
|
198
|
+
tokenIcon: 'https://bafybeiefg3nd5iognbqztkpi5hj34dmwkqfe7v7xeayn2nhhatinmjmzcy.ipfs.dweb.link/send-bch-token-icon.png',
|
|
199
|
+
fullSizedUrl: '',
|
|
200
|
+
optimizedTokenIcon: 'https://p2wdb-gateway-678.fullstack.cash/ipfs/bafybeiefg3nd5iognbqztkpi5hj34dmwkqfe7v7xeayn2nhhatinmjmzcy/send-bch-token-icon.png',
|
|
201
|
+
optimizedFullSizedUrl: '',
|
|
202
|
+
iconRepoCompatible: false,
|
|
203
|
+
ps002Compatible: true
|
|
204
|
+
}
|
|
205
|
+
|
|
153
206
|
module.exports = {
|
|
154
207
|
tokenStats,
|
|
155
208
|
txData,
|
|
156
209
|
balance,
|
|
157
210
|
status,
|
|
158
211
|
tokenData01,
|
|
159
|
-
tokenData
|
|
212
|
+
tokenData,
|
|
213
|
+
tokenMedia01
|
|
160
214
|
}
|
package/test/unit/price.js
CHANGED
|
@@ -19,18 +19,18 @@ describe('#price', () => {
|
|
|
19
19
|
|
|
20
20
|
afterEach(() => sandbox.restore())
|
|
21
21
|
|
|
22
|
-
describe('#current', () => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
})
|
|
22
|
+
// describe('#current', () => {
|
|
23
|
+
// it('should get current price for single currency', async () => {
|
|
24
|
+
// sandbox
|
|
25
|
+
// .stub(bchjs.Price.axios, 'get')
|
|
26
|
+
// .resolves({ data: { price: 24905 } })
|
|
27
|
+
//
|
|
28
|
+
// const result = await bchjs.Price.current('usd')
|
|
29
|
+
// // console.log(result)
|
|
30
|
+
//
|
|
31
|
+
// assert.isNumber(result)
|
|
32
|
+
// })
|
|
33
|
+
// })
|
|
34
34
|
|
|
35
35
|
describe('#getUsd', () => {
|
|
36
36
|
it('should get the USD price of BCH', async () => {
|
|
@@ -411,4 +411,28 @@ describe('#PsfSlpIndexer', () => {
|
|
|
411
411
|
}
|
|
412
412
|
})
|
|
413
413
|
})
|
|
414
|
+
|
|
415
|
+
describe('#getTokenData2', () => {
|
|
416
|
+
it('should get token data', async () => {
|
|
417
|
+
// Stub the network call.
|
|
418
|
+
sandbox.stub(axios, 'post').resolves({ data: mockData.tokenMedia01 })
|
|
419
|
+
|
|
420
|
+
const tokenId =
|
|
421
|
+
'd9aafa7acb514c597caf440ae268b5e4e955f2687e05f044cdf8fd9550d9a27b'
|
|
422
|
+
|
|
423
|
+
// bchjs.PsfSlpIndexer.restURL = 'http://localhost:3000/v5/'
|
|
424
|
+
const result = await bchjs.PsfSlpIndexer.getTokenData2(tokenId)
|
|
425
|
+
// console.log('result: ', result)
|
|
426
|
+
|
|
427
|
+
assert.property(result, 'tokenStats')
|
|
428
|
+
assert.property(result, 'mutableData')
|
|
429
|
+
assert.property(result, 'immutableData')
|
|
430
|
+
assert.property(result, 'tokenIcon')
|
|
431
|
+
assert.property(result, 'fullSizedUrl')
|
|
432
|
+
assert.property(result, 'optimizedTokenIcon')
|
|
433
|
+
assert.property(result, 'optimizedFullSizedUrl')
|
|
434
|
+
assert.property(result, 'iconRepoCompatible')
|
|
435
|
+
assert.property(result, 'ps002Compatible')
|
|
436
|
+
})
|
|
437
|
+
})
|
|
414
438
|
})
|