mirror of
https://github.com/Permissionless-Software-Foundation/ipfs-bch-wallet-service.git
synced 2026-09-21 16:52:03 -07:00
feat(utxoIsValid): Adding new bch endpoint
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"srcDir": "",
|
||||||
|
"destDir": "",
|
||||||
|
"files": "**/*.js",
|
||||||
|
"command": "npm run lint"
|
||||||
|
}
|
||||||
|
]
|
||||||
Generated
+418
-219
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -24,7 +24,7 @@
|
|||||||
},
|
},
|
||||||
"repository": "Permissionless-Software-Foundation/ipfs-bch-wallet-service",
|
"repository": "Permissionless-Software-Foundation/ipfs-bch-wallet-service",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@psf/bch-js": "6.3.4",
|
"@psf/bch-js": "6.4.0",
|
||||||
"axios": "0.25.0",
|
"axios": "0.25.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"glob": "7.1.6",
|
"glob": "7.1.6",
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ class BCHRPC {
|
|||||||
case 'pubkey':
|
case 'pubkey':
|
||||||
await this.rateLimit.limiter(rpcData.from)
|
await this.rateLimit.limiter(rpcData.from)
|
||||||
return await this.pubKey(rpcData)
|
return await this.pubKey(rpcData)
|
||||||
|
|
||||||
|
case 'utxoIsValid':
|
||||||
|
await this.rateLimit.limiter(rpcData.from)
|
||||||
|
return await this.utxoIsValid(rpcData)
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Error in BCHRPC/rpcRouter()')
|
console.error('Error in BCHRPC/rpcRouter()')
|
||||||
@@ -612,6 +616,79 @@ class BCHRPC {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {JSON} /bch UtxoIsValid
|
||||||
|
* @apiPermission public
|
||||||
|
* @apiName UtxoIsValid
|
||||||
|
* @apiGroup JSON BCH
|
||||||
|
* @apiDescription Verify if UTXO is valid
|
||||||
|
* Given a UTXO object (txid and vout), a full node is queried to verify that
|
||||||
|
* the UTXO still exists in the mempool (true), or if it has been spent (false).
|
||||||
|
*
|
||||||
|
* - jsonrpc: "" - jsonrpc version
|
||||||
|
* - id: "" - jsonrpc id
|
||||||
|
* - result: {} - Result of the petition with the RPC information
|
||||||
|
* - success: - Request status
|
||||||
|
* - publickey: - Address public key
|
||||||
|
*
|
||||||
|
* @apiExample Example usage:
|
||||||
|
* {"jsonrpc":"2.0","id":"555","method":"bch","params":{ "endpoint": "utxoIsValid", "utxo": {"tx_hash": "17754221b29f189532d4fc2ae89fb467ad2dede30fdec4854eb2129b3ba90d7a", "tx_pos": 0}}}
|
||||||
|
*
|
||||||
|
* @apiSuccessExample {json} Success-Response:
|
||||||
|
* {
|
||||||
|
* "jsonrpc":"2.0",
|
||||||
|
* "id":"555",
|
||||||
|
* "result":{
|
||||||
|
* "method":"bch",
|
||||||
|
* "reciever":"QmU86vLVbUY1UhziKB6rak7GPKRA2QHWvzNm2AjEvXNsT6",
|
||||||
|
* "value":{
|
||||||
|
* "success": true,
|
||||||
|
* "status": 200,
|
||||||
|
* "endpoint": "pubkey",
|
||||||
|
* "pubkey": {
|
||||||
|
* "success": true,
|
||||||
|
* "publicKey": "033f267fec0f7eb2b27f8c2e3052b3d03b09d36b47de4082ffb638ffb334ef0eee"
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
async utxoIsValid (rpcData) {
|
||||||
|
try {
|
||||||
|
// console.log('createUser rpcData: ', rpcData)
|
||||||
|
|
||||||
|
const utxo = rpcData.payload.params.utxo
|
||||||
|
// console.log('utxo: ', utxo)
|
||||||
|
|
||||||
|
const isValid = await this.bchjs.Utxo.isValid(utxo)
|
||||||
|
|
||||||
|
const retObj = {
|
||||||
|
success: true,
|
||||||
|
status: 200,
|
||||||
|
endpoint: 'utxoIsValid',
|
||||||
|
isValid
|
||||||
|
}
|
||||||
|
// retObj.status = 200
|
||||||
|
|
||||||
|
return retObj
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error in JSON RPC BCH utxoIsValid()')
|
||||||
|
|
||||||
|
// throw err
|
||||||
|
let error = err
|
||||||
|
if (err.error && typeof err.error === 'string') {
|
||||||
|
error = new Error(err.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return an error response
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
status: 422,
|
||||||
|
message: error.message,
|
||||||
|
endpoint: 'utxoIsValid'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = BCHRPC
|
module.exports = BCHRPC
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
Integration tests for the endpoints in controllers/json-rpc/bch
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Global npm libraries
|
||||||
|
const assert = require('chai').assert
|
||||||
|
|
||||||
|
// Local libraries
|
||||||
|
const BCHController = require('../../../../src/controllers/json-rpc/bch')
|
||||||
|
const Adapters = require('../../../../src/adapters')
|
||||||
|
const UseCases = require('../../../../src/use-cases')
|
||||||
|
|
||||||
|
describe('#BCH', () => {
|
||||||
|
let uut
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
const adapters = new Adapters()
|
||||||
|
const useCases = new UseCases({ adapters })
|
||||||
|
// await adapters.start()
|
||||||
|
|
||||||
|
uut = new BCHController({ adapters, useCases })
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('#utxoIsValid', () => {
|
||||||
|
it('should return true for valid UTXO with fullnode properties', async () => {
|
||||||
|
const rpcData = {
|
||||||
|
payload: {
|
||||||
|
params: {
|
||||||
|
utxo: {
|
||||||
|
txid: 'b94e1ff82eb5781f98296f0af2488ff06202f12ee92b0175963b8dba688d1b40',
|
||||||
|
vout: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await uut.utxoIsValid(rpcData)
|
||||||
|
// console.log('result: ', result)
|
||||||
|
|
||||||
|
assert.equal(result.isValid, true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return true for valid UTXO with fulcrum properties', async () => {
|
||||||
|
const rpcData = {
|
||||||
|
payload: {
|
||||||
|
params: {
|
||||||
|
utxo: {
|
||||||
|
tx_hash: 'b94e1ff82eb5781f98296f0af2488ff06202f12ee92b0175963b8dba688d1b40',
|
||||||
|
tx_pos: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await uut.utxoIsValid(rpcData)
|
||||||
|
// console.log('result: ', result)
|
||||||
|
|
||||||
|
assert.equal(result.isValid, true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return false for valid UTXO with fullnode properties', async () => {
|
||||||
|
const rpcData = {
|
||||||
|
payload: {
|
||||||
|
params: {
|
||||||
|
utxo: {
|
||||||
|
txid: '17754221b29f189532d4fc2ae89fb467ad2dede30fdec4854eb2129b3ba90d7a',
|
||||||
|
vout: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await uut.utxoIsValid(rpcData)
|
||||||
|
// console.log('result: ', result)
|
||||||
|
|
||||||
|
assert.equal(result.isValid, false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return false for valid UTXO with fulcrum properties', async () => {
|
||||||
|
const rpcData = {
|
||||||
|
payload: {
|
||||||
|
params: {
|
||||||
|
utxo: {
|
||||||
|
tx_hash: '17754221b29f189532d4fc2ae89fb467ad2dede30fdec4854eb2129b3ba90d7a',
|
||||||
|
tx_pos: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await uut.utxoIsValid(rpcData)
|
||||||
|
// console.log('result: ', result
|
||||||
|
|
||||||
|
assert.equal(result.isValid, false)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -14,7 +14,7 @@ describe('#BCH', () => {
|
|||||||
|
|
||||||
before(async () => {
|
before(async () => {
|
||||||
const adapters = new Adapters()
|
const adapters = new Adapters()
|
||||||
await adapters.start()
|
// await adapters.start()
|
||||||
|
|
||||||
uut = new BCHUseCases({ adapters })
|
uut = new BCHUseCases({ adapters })
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -488,6 +488,7 @@ describe('#BCHRPC', () => {
|
|||||||
assert.equal(response.message, 'No transaction history.')
|
assert.equal(response.message, 'No transaction history.')
|
||||||
assert.equal(response.endpoint, 'pubkey')
|
assert.equal(response.endpoint, 'pubkey')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should return an error for invalid input', async () => {
|
it('should return an error for invalid input', async () => {
|
||||||
// Force an error
|
// Force an error
|
||||||
sandbox
|
sandbox
|
||||||
@@ -513,4 +514,80 @@ describe('#BCHRPC', () => {
|
|||||||
assert.equal(response.endpoint, 'pubkey')
|
assert.equal(response.endpoint, 'pubkey')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('#utxoIsValid', () => {
|
||||||
|
it('should return false if UTXO.isValid() returns false', async () => {
|
||||||
|
// Mock dependencies
|
||||||
|
sandbox
|
||||||
|
.stub(uut.bchjs.Utxo, 'isValid')
|
||||||
|
.resolves(false)
|
||||||
|
|
||||||
|
const rpcData = {
|
||||||
|
payload: {
|
||||||
|
params: {
|
||||||
|
utxo: {
|
||||||
|
txid: 'b94e1ff82eb5781f98296f0af2488ff06202f12ee92b0175963b8dba688d1b40',
|
||||||
|
vout: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await uut.utxoIsValid(rpcData)
|
||||||
|
// console.log('result: ', result)
|
||||||
|
|
||||||
|
assert.equal(result.isValid, false)
|
||||||
|
assert.equal(result.success, true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return true if UTXO.isValid() returns true', async () => {
|
||||||
|
// Mock dependencies
|
||||||
|
sandbox
|
||||||
|
.stub(uut.bchjs.Utxo, 'isValid')
|
||||||
|
.resolves(true)
|
||||||
|
|
||||||
|
const rpcData = {
|
||||||
|
payload: {
|
||||||
|
params: {
|
||||||
|
utxo: {
|
||||||
|
txid: 'b94e1ff82eb5781f98296f0af2488ff06202f12ee92b0175963b8dba688d1b40',
|
||||||
|
vout: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await uut.utxoIsValid(rpcData)
|
||||||
|
// console.log('result: ', result)
|
||||||
|
|
||||||
|
assert.equal(result.isValid, true)
|
||||||
|
assert.equal(result.success, true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should catch and return errors', async () => {
|
||||||
|
// Mock dependencies
|
||||||
|
sandbox
|
||||||
|
.stub(uut.bchjs.Utxo, 'isValid')
|
||||||
|
.rejects(new Error('test error'))
|
||||||
|
|
||||||
|
const rpcData = {
|
||||||
|
payload: {
|
||||||
|
params: {
|
||||||
|
utxo: {
|
||||||
|
txid: 'b94e1ff82eb5781f98296f0af2488ff06202f12ee92b0175963b8dba688d1b40',
|
||||||
|
vout: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await uut.utxoIsValid(rpcData)
|
||||||
|
// console.log('result: ', result)
|
||||||
|
|
||||||
|
assert.equal(result.success, false)
|
||||||
|
assert.equal(result.status, 422)
|
||||||
|
assert.equal(result.message, 'test error')
|
||||||
|
assert.equal(result.endpoint, 'utxoIsValid')
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ const bchjs = {
|
|||||||
sortAllTxs: () => {}
|
sortAllTxs: () => {}
|
||||||
},
|
},
|
||||||
Utxo: {
|
Utxo: {
|
||||||
get: () => {}
|
get: () => {},
|
||||||
|
isValid: () => true
|
||||||
},
|
},
|
||||||
Transaction: {
|
Transaction: {
|
||||||
get: () => {}
|
get: () => {}
|
||||||
|
|||||||
Reference in New Issue
Block a user