Compare commits

..
8 Commits
4 changed files with 90 additions and 28 deletions
+8 -8
View File
@@ -70,10 +70,10 @@ services:
restart: always
bch-dex:
build:
context: ./bch-dex/
dockerfile: Dockerfile
#image: christroutner/bch-dex:v1.9.6
#build:
# context: ./bch-dex/
# dockerfile: Dockerfile
image: christroutner/bch-dex:v1.13.0
container_name: bch-dex
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
@@ -94,10 +94,10 @@ services:
restart: always
dex-ui:
build:
context: ./bch-dex-ui/
dockerfile: Dockerfile
#image: christroutner/bch-dex-ui:v1.6.6
#build:
# context: ./bch-dex-ui/
# dockerfile: Dockerfile
image: christroutner/bch-dex-ui:v1.12.0
container_name: dex-ui
environment:
SERVER: 'http://192.168.2.3'
+8 -7
View File
@@ -46,7 +46,7 @@ services:
image: christroutner/p2wdb-rpi:v3.0.10
container_name: p2wdb
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
CONSUMER_URL: 'https://wa-usa-bch-consumer.fullstackcash.nl'
DEBUG_LEVEL: 1
logging:
driver: 'json-file'
@@ -67,13 +67,14 @@ services:
restart: always
bch-dex:
build:
context: ./bch-dex/
dockerfile: Dockerfile
#image: christroutner/bch-dex-rpi:v1.9.8
#build:
# context: ./bch-dex/
# dockerfile: Dockerfile
image: christroutner/bch-dex-rpi:v1.13.0
container_name: bch-dex
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
#CONSUMER_URL: 'https://free-bch.fullstack.cash'
CONSUMER_URL: 'https://wa-usa-bch-consumer.fullstackcash.nl'
logging:
driver: 'json-file'
options:
@@ -94,7 +95,7 @@ services:
#build:
# context: ./bch-dex-ui/
# dockerfile: Dockerfile
image: christroutner/bch-dex-ui-rpi:v1.7.5
image: christroutner/bch-dex-ui-rpi:v1.13.0
container_name: dex-ui
logging:
driver: 'json-file'
+60 -7
View File
@@ -13,6 +13,9 @@
a partially signed transaction.
*/
// Global npm libraries
const axios = require('axios')
// Local libraries
const OfferEntity = require('../../entities/offer')
const config = require('../../../config')
@@ -39,6 +42,7 @@ class OfferUseCases {
// Encapsulate dependencies
this.config = config
this.axios = axios
this.offerEntity = new OfferEntity()
this.OfferModel = this.adapters.localdb.Offer
@@ -84,12 +88,22 @@ class OfferUseCases {
const offerEntity = this.offerEntity.validate(offerObj)
console.log('offerEntity: ', offerEntity)
// Get data about the token.
const tokenId = offerEntity.tokenId
const tokenData = await this.adapters.wallet.bchWallet.getTokenData(tokenId)
console.log(`tokenData: ${JSON.stringify(tokenData, null, 2)}`)
// Generate a 'display category' for the token. This will allow the
// front end UI to figure out how to display the token.
const displayCategory = await this.categorizeToken(offerEntity)
const displayCategory = await this.categorizeToken(offerEntity, tokenData)
console.log('displayCategory: ', displayCategory)
offerEntity.displayCategory = displayCategory
// Detect if user set the NSFW flag.
let nsfw = false
nsfw = await this.detectNsfw(tokenData)
offerEntity.nsfw = nsfw
// Add offer to the local database.
const offerModel = new this.OfferModel(offerEntity)
await offerModel.save()
@@ -101,6 +115,45 @@ class OfferUseCases {
}
}
// By default this function returns false, to indicate the NFT is safe for work.
// If the user who created the token sets the nsfw property in the mutable data,
// this function will return true.
async detectNsfw (tokenData) {
try {
let nsfw = false
const mutableCid = tokenData.mutableData
// If there is no mutable IPFS CID, then skip this token.
if (!mutableCid.includes('ipfs://')) return nsfw
// Revove the ipfs:// prefix.
const cid = mutableCid.substring(7)
// Retrieve the mutable data from Filecoin/IPFS.
const url = `https://${cid}.ipfs.w3s.link/data.json`
const result = await axios.get(url)
const mutableData = result.data
console.log(`mutableData: ${JSON.stringify(mutableData, null, 2)}`)
// Logical tests
const hasNsfw = !!mutableData.nsfw
const nsfwSetTrue = mutableData.nsfw === true
const nsfwStringTrue = mutableData.nsfw === 'true'
const nsfwDetected = hasNsfw && (nsfwSetTrue || nsfwStringTrue)
if (nsfwDetected) {
console.log('NSFW flag set as true')
nsfw = true
}
return nsfw
} catch (err) {
console.error('Error in detectNsfw(): ', err)
return false
}
}
// Categorize the token for display purposes. This will categorize a token
// into one of these categories:
// - nft
@@ -111,14 +164,14 @@ class OfferUseCases {
// 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) {
async categorizeToken (offerData, tokenData) {
try {
console.log(`categorizeToken(): ${JSON.stringify(offerData, null, 2)}`)
// 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)}`)
// const tokenId = offerData.tokenId
//
// const tokenData = await this.adapters.wallet.bchWallet.getTokenData(tokenId)
// console.log(`tokenData: ${JSON.stringify(tokenData, null, 2)}`)
if (tokenData.genesisData.type === 65) {
return 'nft'
+14 -6
View File
@@ -74,6 +74,9 @@ describe('#offer-use-case', () => {
// Mock dependencies
sandbox.stub(uut.adapters.bchjs.Blockchain, 'getTxOut').resolves(null)
sandbox.stub(uut.adapters.wallet.bchWallet, 'getTokenData').resolves({})
sandbox.stub(uut, 'categorizeToken').resolves('nft')
sandbox.stub(uut, 'detectNsfw').resolves(false)
const result = await uut.createOffer(offerObj)
// console.log('result: ', result)
@@ -120,6 +123,8 @@ describe('#offer-use-case', () => {
coinbase: false
})
sandbox.stub(uut, 'categorizeToken').resolves('fungible')
sandbox.stub(uut.adapters.wallet.bchWallet, 'getTokenData').resolves({})
sandbox.stub(uut, 'detectNsfw').resolves(false)
const result = await uut.createOffer(offerObj)
// console.log('result: ', result)
@@ -131,33 +136,36 @@ describe('#offer-use-case', () => {
describe('#categorizeToken', () => {
it('should categorize an NFT', async () => {
// Mock dependencies
sandbox.stub(uut.adapters.wallet.bchWallet, 'getTokenData').resolves(mockData.nftTokenData01)
// sandbox.stub(uut.adapters.wallet.bchWallet, 'getTokenData').resolves(mockData.nftTokenData01)
const offerData = mockData.nftOffer01
const tokenData = mockData.nftTokenData01
const result = await uut.categorizeToken(offerData)
const result = await uut.categorizeToken(offerData, tokenData)
assert.equal(result, 'nft')
})
it('should categorize a simple NFT', async () => {
// Mock dependencies
sandbox.stub(uut.adapters.wallet.bchWallet, 'getTokenData').resolves(mockData.simpleNftTokenData01)
// sandbox.stub(uut.adapters.wallet.bchWallet, 'getTokenData').resolves(mockData.simpleNftTokenData01)
const offerData = mockData.simpleNftOffer01
const tokenData = mockData.simpleNftTokenData01
const result = await uut.categorizeToken(offerData)
const result = await uut.categorizeToken(offerData, tokenData)
assert.equal(result, 'simple-nft')
})
it('should categorize a fungible token', async () => {
// Mock dependencies
sandbox.stub(uut.adapters.wallet.bchWallet, 'getTokenData').resolves(mockData.fungibleTokenData01)
// sandbox.stub(uut.adapters.wallet.bchWallet, 'getTokenData').resolves(mockData.fungibleTokenData01)
const offerData = mockData.fungibleOffer01
const tokenData = mockData.fungibleTokenData01
const result = await uut.categorizeToken(offerData)
const result = await uut.categorizeToken(offerData, tokenData)
assert.equal(result, 'fungible')
})