Compare commits

..
10 Commits
10 changed files with 1183 additions and 1566 deletions
+1098 -1527
View File
File diff suppressed because it is too large Load Diff
+4 -11
View File
@@ -29,7 +29,7 @@
"dependencies": {
"@psf/bch-js": "6.4.5",
"axios": "0.27.2",
"bch-message-lib": "2.2.0",
"bch-message-lib": "2.2.1",
"bcryptjs": "2.4.3",
"bitcoincashjs-lib": "3.3.3",
"glob": "7.1.6",
@@ -52,11 +52,11 @@
"koa2-ratelimit": "0.9.1",
"libp2p": "^0.36.2",
"line-reader": "0.4.0",
"minimal-slp-wallet": "4.6.5",
"minimal-slp-wallet": "5.1.0",
"mongoose": "5.13.13",
"node-fetch": "npm:@achingbrain/node-fetch@2.6.7",
"nodemailer": "6.7.5",
"p2wdb": "1.4.0",
"p2wdb": "2.2.1",
"passport-local": "1.0.0",
"public-ip": "^4.0.4",
"winston": "3.3.3",
@@ -67,19 +67,12 @@
"bch-token-sweep": "2.1.2",
"chai": "4.3.0",
"coveralls": "2.11.4",
"eslint": "7.19.0",
"eslint-config-prettier": "7.2.0",
"eslint-config-standard": "16.0.2",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-prettier": "3.3.1",
"eslint-plugin-promise": "^4.3.1",
"eslint-plugin-standard": "4.0.0",
"husky": "4.3.8",
"mocha": "10.0.0",
"nyc": "15.1.0",
"semantic-release": "19.0.3",
"sinon": "9.2.4",
"standard": "16.0.4",
"standard": "17.0.0",
"uuid": "8.3.2"
},
"release": {
+1 -1
View File
@@ -73,7 +73,7 @@ services:
#build:
# context: ./bch-dex/
# dockerfile: Dockerfile
image: christroutner/bch-dex:v1.9.2
image: christroutner/bch-dex:v1.9.6
container_name: bch-dex
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
+1 -1
View File
@@ -70,7 +70,7 @@ services:
#build:
# context: ./bch-dex/
# dockerfile: Dockerfile
image: christroutner/bch-dex-rpi:v1.8.3
image: christroutner/bch-dex-rpi:v1.9.6
container_name: bch-dex
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
+1
View File
@@ -37,6 +37,7 @@ class Adapters {
this.bch = new BCHAdapter()
this.config = config
this.wallet = new WalletAdapter()
localConfig.bchWallet = this.wallet.bchWallet
this.p2wdb = new P2wdbAdapter(localConfig)
this.webhook = new Webhook()
+12 -5
View File
@@ -12,9 +12,9 @@ const config = require('../../config')
class P2wdbAdapter {
constructor (localConfig = {}) {
// Dependency injection
this.bchjs = localConfig.bchjs
if (!this.bchjs) {
throw new Error('Must pass an instance of bch-js when instantiating p2wdb.js adapter.')
this.bchWallet = localConfig.bchWallet
if (!this.bchWallet) {
throw new Error('Must pass an instance of minimal-slp-wallet as bchWallet when instantiating p2wdb.js adapter.')
}
// Encapsulate dependencies
@@ -22,6 +22,7 @@ class P2wdbAdapter {
this.config = config
this.Write = Write
this.Read = Read
this.bchjs = this.bchWallet.bchjs
// Allow the localConfig to overwrite the config file values.
this.p2wdbURL = localConfig.p2wdbURL || config.p2wdbUrl
@@ -51,6 +52,10 @@ class P2wdbAdapter {
// settings.
instantiateWriteLib (wif) {
try {
if (!wif) {
throw new Error('WIF input required when calling instantiateWriteLib()')
}
// Object used to configure the Write library.
let configObj = {}
@@ -62,7 +67,8 @@ class P2wdbAdapter {
wif,
serverURL: this.p2wdbURL,
restURL: this.bchjs.restURL,
apiToken: this.bchjs.apiToken
apiToken: this.bchjs.apiToken,
bchWallet: this.bchWallet
}
} else {
// Use web 3 infrastructure.
@@ -72,7 +78,8 @@ class P2wdbAdapter {
wif,
serverURL: this.p2wdbURL,
interface: 'consumer-api',
restURL: this.config.consumerUrl
restURL: this.config.consumerUrl,
bchWallet: this.bchWallet
}
}
+3 -1
View File
@@ -20,9 +20,10 @@ class WalletAdapter {
// Encapsulate dependencies
this.jsonFiles = new JsonFiles()
this.WALLET_FILE = WALLET_FILE
this.BchWallet = BchWallet
this.config = config
this.bitcoinJs = bitcoinJs
this.BchWallet = BchWallet
this.bchWallet = {} // Will be replaced when initialized.
}
// Open the wallet file, or create one if the file doesn't exist.
@@ -91,6 +92,7 @@ class WalletAdapter {
// Wait for wallet to initialize.
await this.bchWallet.walletInfoPromise
await this.bchWallet.initialize()
console.log(`BCH wallet initialized. Wallet address: ${this.bchWallet.walletInfo.cashAddress}`)
// console.log(`this.bchWallet.walletInfo: ${JSON.stringify(this.bchWallet.walletInfo, null, 2)}`)
+39 -6
View File
@@ -80,6 +80,9 @@ class OfferUseCases {
const offerEntity = this.offerEntity.validate(offerObj)
console.log('offerEntity: ', offerEntity)
// const displayCategory = await this.categorizeToken(offerEntity)
// console.log('displayCategory: ', displayCategory)
// Add offer to the local database.
const offerModel = new this.OfferModel(offerEntity)
await offerModel.save()
@@ -91,6 +94,27 @@ class OfferUseCases {
}
}
// Categorize the token for display purposes. This will categorize a token
// into one of these categories:
// - nft
// - group
// - fungible
// - simple-nft
//
// The first three are easy to categorize. The simple-nft is a fungible token
// with a quantity of 1, decimals of 0, and no minting baton. Categorizing this
// type of token is the main reason why this function exists.
async categorizeToken (offerData) {
console.log(`categorizeToken(): ${JSON.stringify(offerData, null, 2)}`)
const tokenId = offerData.tokenId
const tokenData = await this.adapters.wallet.bchWallet.getTokenData(tokenId)
console.log(`tokenData: ${JSON.stringify(tokenData, null, 2)}`)
return 'placeholder'
}
async listOffers () {
try {
return this.OfferModel.find({}).sort('-timestamp')
@@ -352,10 +376,19 @@ class OfferUseCases {
let utxoStatus = null
try {
// Get the status of the UTXO associate with this Offer.
utxoStatus = await this.adapters.bchjs.Blockchain.getTxOut(
thisOffer.utxoTxid,
thisOffer.utxoVout
)
// utxoStatus = await this.adapters.bchjs.Blockchain.getTxOut(
// thisOffer.utxoTxid,
// thisOffer.utxoVout
// )
// Get the status of the UTXO associate with this Offer.
const utxo = {
tx_hash: thisOffer.utxoTxid,
tx_pos: thisOffer.utxoVout
}
// console.log(`Checking this UTXO: ${JSON.stringify(utxo, null, 2)}`)
utxoStatus = await this.adapters.wallet.bchWallet.utxoIsValid(utxo)
// console.log('utxoStatus: ', utxoStatus)
} catch (err) {
// Handle corner case of bad-data in the Offer model.
@@ -364,7 +397,7 @@ class OfferUseCases {
await thisOffer.remove()
continue
} else if (err.isAxiosError) {
console.log('Error trying to contact api.fullstack.cash')
console.log('Error trying to contact wallet service: ', err)
continue
} else {
throw err
@@ -372,7 +405,7 @@ class OfferUseCases {
}
// If the Offer UTXO is spent, delete the Offer model.
if (utxoStatus === null) {
if (!utxoStatus) {
console.log(`Spent UTXO detected. Deleting this Offer: ${JSON.stringify(thisOffer, null, 2)}`)
await thisOffer.remove()
}
+13 -6
View File
@@ -198,10 +198,17 @@ class OrderLib {
let utxoStatus = null
try {
// Get the status of the UTXO associate with this Order.
utxoStatus = await this.adapters.bchjs.Blockchain.getTxOut(
thisOrder.utxoTxid,
thisOrder.utxoVout
)
// utxoStatus = await this.adapters.bchjs.Blockchain.getTxOut(
// thisOrder.utxoTxid,
// thisOrder.utxoVout
// )
// Get the status of the UTXO associate with this Order.
const utxo = {
tx_hash: thisOrder.utxoTxid,
tx_pos: thisOrder.utxoVout
}
utxoStatus = await this.adapters.wallet.bchWallet.utxoIsValid(utxo)
// console.log('utxoStatus: ', utxoStatus)
} catch (err) {
// Handle corner case of bad-data in the Order model.
@@ -210,7 +217,7 @@ class OrderLib {
await thisOrder.remove()
continue
} else if (err.isAxiosError) {
console.log('Error trying to contact api.fullstack.cash')
console.log('Error trying to contact wallet service: ', err)
continue
} else {
throw err
@@ -218,7 +225,7 @@ class OrderLib {
}
// If the Order UTXO is spent, delete the Order model.
if (utxoStatus === null) {
if (!utxoStatus) {
console.log(`Spent UTXO detected. Deleting this Order: ${JSON.stringify(thisOrder, null, 2)}`)
await thisOrder.remove()
}
+11 -8
View File
@@ -5,31 +5,34 @@
// Public npm libraries.
const assert = require('chai').assert
const sinon = require('sinon')
const BCHJS = require('@psf/bch-js')
// const BCHJS = require('@psf/bch-js')
const BchWallet = require('minimal-slp-wallet/index.js')
// Local libraries.
const P2wdbAdapter = require('../../../src/adapters/p2wdb-adapter')
describe('#P2wdbAdapter', () => {
let uut, sandbox
let uut, sandbox, bchWallet
beforeEach(() => {
const bchjs = new BCHJS()
beforeEach(async () => {
// const bchjs = new BCHJS()
bchWallet = new BchWallet()
await bchWallet.walletInfoPromise
uut = new P2wdbAdapter({ bchjs })
uut = new P2wdbAdapter({ bchWallet })
sandbox = sinon.createSandbox()
})
afterEach(() => sandbox.restore())
describe('#constructor', () => {
it('should throw error if bch-js is not passed in', () => {
it('should throw error if bchWallet is not passed in', () => {
try {
uut = new P2wdbAdapter()
assert.fail('Unexpected coded path')
} catch (err) {
assert.include(err.message, 'Must pass an instance of bch-js when instantiating p2wdb.js adapter.')
assert.include(err.message, 'Must pass an instance of minimal-slp-wallet as bchWallet when instantiating p2wdb.js adapter.')
}
})
})
@@ -82,7 +85,7 @@ describe('#P2wdbAdapter', () => {
assert.fail('Unexpected code path')
} catch (err) {
// console.log(err)
assert.include(err.message, 'WIF private key required')
assert.include(err.message, 'WIF input required when calling instantiateWriteLib()')
}
})
})