Compare commits

..
17 Commits
Author SHA1 Message Date
Chris Troutner 34841f53db Merge pull request #43 from Permissionless-Software-Foundation/ct-unstable
fix(offer): Fixing bugs related to making and taking offers
2022-09-11 10:54:53 -07:00
Chris Troutner c27209cceb fix(offer): Fixing bugs related to making and taking offers 2022-09-11 10:51:32 -07:00
Chris Troutner 5a0fc31c7a Merge pull request #42 from Permissionless-Software-Foundation/ct-unstable
Updating depenencies. Fixing issue with garbage collection.
2022-09-11 09:24:28 -07:00
Chris Troutner 4701f245b9 fix(garbage collection): Fixing issue with garbage collection 2022-09-11 09:21:50 -07:00
Chris Troutner daa06a57ed fix(deps): Updated dependencies and updated tests 2022-09-11 07:39:58 -07:00
Chris Troutner b3157a04ed Merge pull request #41 from Permissionless-Software-Foundation/ct-unstable
Updating docker images
2022-09-11 07:06:35 -07:00
Chris Troutner 3753db46f6 fixing merge conflict 2022-09-11 07:02:27 -07:00
Chris Troutner b924449d02 Updating docker images 2022-09-11 06:57:54 -07:00
Chris Troutner dd8d992b8a Merge pull request #40 from Permissionless-Software-Foundation/ct-unstable
fix(garbage collection): Replacing web2 with web3 calls to validate UTXO
2022-09-04 15:49:43 -07:00
Chris Troutner 4ed657ae28 fix(production): Creating new v1.9.6 docker images for amd64 and arm64 2022-09-04 15:35:50 -07:00
Chris Troutner e14633db79 Updating bch-message-lib 2022-09-04 14:38:11 -07:00
Chris Troutner 6a4e749218 fix(garbage collection): Replacing web2 with web3 calls to validate UTXO 2022-09-04 14:27:51 -07:00
Chris Troutner 7a5036e3aa Merge pull request #39 from Permissionless-Software-Foundation/ct-unstable
fix(production): Created new RPi images
2022-08-28 16:20:45 -07:00
Chris Troutner cca10452c0 fix(production): Created new RPi images 2022-08-28 16:17:33 -07:00
Chris Troutner 309ea0774d Merge pull request #38 from Permissionless-Software-Foundation/ct-unstable
New Docker images
2022-08-28 10:15:13 -07:00
Chris Troutner c2b68a0787 fix(production): Using new docker images 2022-08-28 10:12:36 -07:00
Chris Troutner 2bb4cd7cae fix(production): Updating Dockerfiles 2022-08-28 09:23:47 -07:00
12 changed files with 1232 additions and 1603 deletions
+1102 -1528
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": {
+5 -5
View File
@@ -37,7 +37,7 @@ WORKDIR /home/safeuser
RUN npm install -g npm
# npm mirror to prevent direct dependency on npm.
RUN npm set registry http://94.130.170.209:4873/
#RUN npm set registry http://94.130.170.209:4873/
# Switch to user account.
#USER safeuser
@@ -46,11 +46,11 @@ RUN npm set registry http://94.130.170.209:4873/
# Clone the rest.bitcoin.com repository
WORKDIR /home/safeuser
RUN git clone https://github.com/Permissionless-Software-Foundation/bch-dex-ui
RUN git clone https://github.com/Permissionless-Software-Foundation/bch-dex-ui-v2
# Switch to the desired branch. `master` is usually stable,
# and `stage` has the most up-to-date changes.
WORKDIR /home/safeuser/bch-dex-ui
WORKDIR /home/safeuser/bch-dex-ui-v2
# For development: switch to unstable branch
RUN git checkout ct-unstable
@@ -58,7 +58,7 @@ RUN git checkout ct-unstable
# Install dependencies
#RUN mkdir .ipfsdata
#RUN npm install -g @mapbox/node-pre-gyp
RUN npm install --force
RUN npm install
# Build the site
RUN CI=true npm run build
@@ -68,6 +68,6 @@ FROM nginx
EXPOSE 80
# Copy the files built in the first container to the new NGINX container.
COPY --from=builder /home/safeuser/bch-dex-ui/public /usr/share/nginx/html
COPY --from=builder /home/safeuser/bch-dex-ui-v2/build /usr/share/nginx/html
#USER safeuser
+2 -2
View File
@@ -73,7 +73,7 @@ services:
#build:
# context: ./bch-dex/
# dockerfile: Dockerfile
image: christroutner/bch-dex:v1.9.1
image: christroutner/bch-dex:v1.9.6
container_name: bch-dex
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
@@ -97,7 +97,7 @@ services:
#build:
# context: ./bch-dex-ui/
# dockerfile: Dockerfile
image: christroutner/bch-dex-ui:v1.6.5
image: christroutner/bch-dex-ui:v1.6.6
container_name: dex-ui
environment:
SERVER: 'http://192.168.2.3'
+4 -4
View File
@@ -46,11 +46,11 @@ RUN npm set registry http://94.130.170.209:4873/
# Clone the rest.bitcoin.com repository
WORKDIR /home/safeuser
RUN git clone https://github.com/Permissionless-Software-Foundation/bch-dex-ui
RUN git clone https://github.com/Permissionless-Software-Foundation/bch-dex-ui-v2
# Switch to the desired branch. `master` is usually stable,
# and `stage` has the most up-to-date changes.
WORKDIR /home/safeuser/bch-dex-ui
WORKDIR /home/safeuser/bch-dex-ui-v2
# For development: switch to unstable branch
RUN git checkout ct-unstable
@@ -58,7 +58,7 @@ RUN git checkout ct-unstable
# Install dependencies
#RUN mkdir .ipfsdata
#RUN npm install -g @mapbox/node-pre-gyp
RUN npm install --force
RUN npm install
# Build the site
RUN CI=true npm run build
@@ -68,6 +68,6 @@ FROM nginx
EXPOSE 80
# Copy the files built in the first container to the new NGINX container.
COPY --from=builder /home/safeuser/bch-dex-ui/public /usr/share/nginx/html
COPY --from=builder /home/safeuser/bch-dex-ui-v2/build /usr/share/nginx/html
#USER safeuser
+15 -19
View File
@@ -14,40 +14,36 @@ services:
restart: always
ipfs:
#image: ipfs/go-ipfs:v0.13.0
image: odanado/go-ipfs:v0.11.0
image: christroutner/trickle-ipfs-rpi:v1.0.1
#image: odanado/go-ipfs:v0.11.0
container_name: ipfs
environment:
MY_ENV_VAR: 'placeholder'
IPFS_DAEMON_ARGUMENTS: '--enable-pubsub-experiment --migrate=true --agent-version-suffix=docker --routing=dhtclient'
UPLOAD_KBPS: '25'
DOWNLOAD_KBPS: '25'
logging:
driver: 'json-file'
options:
max-size: '10m'
max-file: '10'
mem_limit: 2000mb
mem_limit: 1000mb
ports:
- 4001:4001
- 4003:4003
- 172.17.0.1:5001:5001
- 172.17.0.1:8080:8080
volumes:
- ../data/go-ipfs/data:/data/ipfs
# - ../../swarm.key:/data/ipfs/swarm.key
# https://docs.docker.com/compose/compose-file/compose-file-v3/#command
# https://github.com/ipfs/go-ipfs/blob/91c52657166bcf86f2476926e4fe56694dc26562/Dockerfile#L115
command:
[
'daemon',
'--migrate=true',
'--agent-version-suffix=docker',
'--enable-pubsub-experiment'
]
- ./data/go-ipfs:/root/.ipfs
command: [
'./start-ipfs.sh'
]
restart: always
p2wdb:
#build:
# context: ./p2wdb/
# dockerfile: Dockerfile
image: christroutner/p2wdb-rpi-v3.0.6
image: christroutner/p2wdb-rpi:v3.0.10
container_name: p2wdb
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
@@ -72,9 +68,9 @@ services:
bch-dex:
#build:
# context: ./bch-dex/
# context: ./bch-dex/
# dockerfile: Dockerfile
image: christroutner/bch-dex-rpi:v1.8.2
image: christroutner/bch-dex-rpi:v1.9.6
container_name: bch-dex
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
@@ -98,7 +94,7 @@ services:
#build:
# context: ./bch-dex-ui/
# dockerfile: Dockerfile
image: christroutner/bch-dex-ui-rpi:v1.7.4
image: christroutner/bch-dex-ui-rpi:v1.7.5
container_name: dex-ui
logging:
driver: 'json-file'
+5
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()
@@ -70,6 +71,10 @@ class Adapters {
// Wait until a webhook is established with the P2WDB
await this.webhook.waitUntilSuccess(this.config.webhookTarget)
// Overwrite instances of wallet used by P2WDB lib.
this.p2wdb.bchWallet = this.wallet.bchWallet
this.p2wdb.bchjs = this.wallet.bchWallet.bchjs
}
console.log('Async Adapters have been started.')
+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)}`)
+56 -14
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')
@@ -122,15 +146,21 @@ class OfferUseCases {
}
// Verify that UTXO for sale is unspent. Abort if it's been spent.
const txid = offerInfo.utxoTxid
const vout = offerInfo.utxoVout
const utxoStatus = await this.adapters.bchjs.Blockchain.getTxOut(
txid,
vout
)
// const txid = offerInfo.utxoTxid
// const vout = offerInfo.utxoVout
const utxo = {
tx_hash: offerInfo.utxoTxid,
tx_pos: offerInfo.utxoVout
}
const utxoStatus = await this.adapters.wallet.bchWallet.utxoIsValid(utxo)
// const utxoStatus = await this.adapters.bchjs.Blockchain.getTxOut(
// txid,
// vout
// )
console.log('utxoStatus: ', utxoStatus)
if (utxoStatus === null) {
console.log(`utxo txid: ${txid}, vout: ${vout}`)
if (!utxoStatus) {
console.log(`utxo txid: ${offerInfo.utxoTxid}, vout: ${offerInfo.utxoVout}`)
// TODO: Mark this Offer as 'dead'
@@ -212,6 +242,9 @@ class OfferUseCases {
await this.adapters.wallet.bchWallet.walletInfoPromise
// console.log(`utxos: ${JSON.stringify(this.adapters.wallet.bchWallet.utxos.utxoStore, null, 2)}`)
// Refresh the wallet UTXOs
await this.adapters.wallet.bchWallet.initialize()
// Ensure the app wallet has enough funds to write to the P2WDB.
const wif = this.adapters.wallet.bchWallet.walletInfo.privateKey
const canWriteToP2WDB = await this.adapters.p2wdb.checkForSufficientFunds(wif)
@@ -352,10 +385,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 +406,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 +414,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()')
}
})
})