From 549fd4fd5afbf98ca6082e97459d26bc6ce03d1c Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Fri, 2 Dec 2022 07:44:35 -0800 Subject: [PATCH] feat(order): Adding functions needed by AMM --- config/env/common.js | 3 +- package-lock.json | 13 +++--- package.json | 2 +- src/adapters/wallet.js | 46 +++++++++++++++++++- src/controllers/rest-api/order/controller.js | 21 +++++++++ src/controllers/rest-api/order/index.js | 1 + src/use-cases/order.js | 20 +++++++++ 7 files changed, 97 insertions(+), 9 deletions(-) diff --git a/config/env/common.js b/config/env/common.js index d1cf77c..a4f158a 100644 --- a/config/env/common.js +++ b/config/env/common.js @@ -46,7 +46,8 @@ export default { // : 'https://wa-usa-bch-consumer.fullstackcash.nl', // P2WDB URL that will accept API calls from the p2wdb npm library. - p2wdbUrl: process.env.P2WDB_URL ? process.env.P2WDB_URL : 'https://p2wdb.fullstack.cash', + // p2wdbUrl: process.env.P2WDB_URL ? process.env.P2WDB_URL : 'https://p2wdb.fullstack.cash', + p2wdbUrl: process.env.P2WDB_URL ? process.env.P2WDB_URL : 'http://localhost:5010', // FullStack.cash account information, used for automatic JWT handling. getJwtAtStartup: process.env.GET_JWT_AT_STARTUP ? true : false, diff --git a/package-lock.json b/package-lock.json index f87e7f6..f0ff0a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@psf/bch-js": "6.5.1", "axios": "0.27.2", "bch-message-lib": "2.2.1", + "bch-token-sweep": "2.2.1", "bcryptjs": "2.4.3", "bitcoincashjs-lib": "3.3.3", "glob": "7.1.6", @@ -46,7 +47,6 @@ }, "devDependencies": { "apidoc": "0.51.1", - "bch-token-sweep": "2.1.2", "c8": "7.12.0", "chai": "4.3.0", "coveralls": "2.11.4", @@ -2263,9 +2263,9 @@ } }, "node_modules/bch-token-sweep": { - "version": "2.1.2", - "dev": true, - "license": "MIT", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bch-token-sweep/-/bch-token-sweep-2.2.1.tgz", + "integrity": "sha512-f4UGEpPXzea7HQMRSEb6h/amXiwrlsMBAjl1dVYg5//26IDWeG+e3qVNtMJhm00NMZ0BS+LasUa2xlz0UVziZA==", "dependencies": { "bch-donation": "1.1.2", "bignumber.js": "9.0.0" @@ -17230,8 +17230,9 @@ "requires": {} }, "bch-token-sweep": { - "version": "2.1.2", - "dev": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bch-token-sweep/-/bch-token-sweep-2.2.1.tgz", + "integrity": "sha512-f4UGEpPXzea7HQMRSEb6h/amXiwrlsMBAjl1dVYg5//26IDWeG+e3qVNtMJhm00NMZ0BS+LasUa2xlz0UVziZA==", "requires": { "bch-donation": "1.1.2", "bignumber.js": "9.0.0" diff --git a/package.json b/package.json index 7ff31c0..f487784 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@psf/bch-js": "6.5.1", "axios": "0.27.2", "bch-message-lib": "2.2.1", + "bch-token-sweep": "2.2.1", "bcryptjs": "2.4.3", "bitcoincashjs-lib": "3.3.3", "glob": "7.1.6", @@ -65,7 +66,6 @@ }, "devDependencies": { "apidoc": "0.51.1", - "bch-token-sweep": "2.1.2", "c8": "7.12.0", "chai": "4.3.0", "coveralls": "2.11.4", diff --git a/src/adapters/wallet.js b/src/adapters/wallet.js index 4c72c45..3d1fd97 100644 --- a/src/adapters/wallet.js +++ b/src/adapters/wallet.js @@ -4,6 +4,7 @@ // Public npm libraries import BchWallet from 'minimal-slp-wallet' +import BchTokenSweep from 'bch-token-sweep/index.js' import bitcoinJs from 'bitcoincashjs-lib' @@ -22,6 +23,8 @@ const WALLET_FILE = `${__dirname.toString()}/../../wallet.json` // const P2WDB_TOKEN_ID = // '38e97c5d7d3585a2cbf3f9580c82ca33985f9cb0845d4dcce220cb709f9538b0' +const advancedConfig = {} + class WalletAdapter { constructor (localConfig = {}) { // Encapsulate dependencies @@ -87,7 +90,7 @@ class WalletAdapter { throw new Error('Wallet data is not formatted correctly. Can not read mnemonic in wallet file!') } - const advancedConfig = {} + // const advancedConfig = {} console.log(`Using FullStack.cash: ${this.config.useFullStackCash}`) if (this.config.useFullStackCash) { advancedConfig.interface = 'rest-api' @@ -512,6 +515,47 @@ class WalletAdapter { throw err } } + + // Given an Order database object, this function sends the tokens from the + // HD index where they are stored, back to the root address of the wallet. + async reclaimTokens (orderData) { + try { + // Get the key pair from the Order. + const keyPair = await this.getKeyPair(orderData.hdIndex) + console.log('keyPair: ', keyPair) + + // Instantiate the wallet using the private key of the Order. + // const tempWallet = new this.BchWallet(keyPair.wif, advancedConfig) + // await tempWallet.initialize() + + // Send the tokens from the Order to the root address. + // const receiver = { + // address: this.bchWallet.walletInfo.address, + // tokenId: orderData.tokenId, + // qty: orderData.numTokens + // } + // console.log('receiver: ', receiver) + // + // const txid = await tempWallet.sendTokens(receiver) + + // Sweep the tokens to the root address. + const sweeper = new BchTokenSweep( + keyPair.wif, + this.bchWallet.walletInfo.privateKey, + this.bchWallet, + 550, + this.bchWallet.walletInfo.cashAddress + ) + await sweeper.populateObjectFromNetwork() + const hex = await sweeper.sweepTo(this.bchWallet.walletInfo.cashAddress) + const txid = await this.bchWallet.ar.sendTx(hex) + + return txid + } catch (err) { + console.error('Error in wallet.js/reclaimTokens()') + throw err + } + } } export default WalletAdapter diff --git a/src/controllers/rest-api/order/controller.js b/src/controllers/rest-api/order/controller.js index 182f584..fd4ac1a 100644 --- a/src/controllers/rest-api/order/controller.js +++ b/src/controllers/rest-api/order/controller.js @@ -35,6 +35,7 @@ class OrderRESTControllerLib { // console.log('body: ', ctx.request.body) const orderObj = ctx.request.body.order + console.log('orderObj: ', orderObj) const hash = await _this.useCases.order.createOrder(orderObj) @@ -62,6 +63,26 @@ class OrderRESTControllerLib { } } + // Delete an existing order by returning the token to the root address of + // the DEX wallet. + async deleteOrder (ctx) { + try { + // console.log('body: ', ctx.request.body) + + const p2wdbHash = ctx.request.body.p2wdbHash + // console.log('p2wdbHash: ', p2wdbHash) + + const txid = await _this.useCases.order.deleteOrder(p2wdbHash) + + ctx.body = { txid } + } catch (err) { + // console.log(`err.message: ${err.message}`) + // console.log('err: ', err) + // ctx.throw(422, err.message) + _this.handleError(ctx, err) + } + } + // DRY error handler handleError (ctx, err) { console.log('err', err) diff --git a/src/controllers/rest-api/order/index.js b/src/controllers/rest-api/order/index.js index 7d96aa1..ab3dc37 100644 --- a/src/controllers/rest-api/order/index.js +++ b/src/controllers/rest-api/order/index.js @@ -51,6 +51,7 @@ class OrderRouter { // Define the routes and attach the controller. this.router.post('/', _this.orderRESTController.createOrder) this.router.get('/list/all/:page', _this.orderRESTController.listOrders) + this.router.post('/delete', _this.orderRESTController.deleteOrder) // Attach the Controller routes to the Koa app. app.use(_this.router.routes()) diff --git a/src/use-cases/order.js b/src/use-cases/order.js index e3b76a0..de2443e 100644 --- a/src/use-cases/order.js +++ b/src/use-cases/order.js @@ -265,6 +265,26 @@ class OrderLib { throw error } } + + // Delete an Order model by sending the token back to the root address. This + // will allow the garbage collectors to delete the Order and the Offer. + async deleteOrder (p2wdbHash) { + try { + console.log('p2wdbHash: ', p2wdbHash) + + // Find the order by the given hash. + const order = await this.findOrderByHash(p2wdbHash) + console.log('order: ', order) + + // Reclaim the tokens + const txid = await this.adapters.wallet.reclaimTokens(order) + + return txid + } catch (err) { + console.error('Error in use-cases/order/deleteOrder()') + throw err + } + } } export default OrderLib