feat(NFT): Adding support for NFTs

This commit is contained in:
Chris Troutner
2022-05-08 10:45:21 -07:00
parent 07fbe8c654
commit c51f7cdf3a
12 changed files with 123 additions and 164 deletions
+1 -1
View File
@@ -91,7 +91,7 @@ class Server {
// MIDDLEWARE END // MIDDLEWARE END
// Delay startup to give the P2WDB time to start first, so that it accepts the webook call // Delay startup to give the P2WDB time to start first, so that it accepts the webook call
await sleep(20000) await sleep(2000)
// Create webhook // Create webhook
try { try {
+57 -141
View File
@@ -9,7 +9,7 @@
"version": "1.0.0", "version": "1.0.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@psf/bch-js": "6.2.5", "@psf/bch-js": "6.3.1",
"axios": "0.21.1", "axios": "0.21.1",
"bch-message-lib": "2.2.0", "bch-message-lib": "2.2.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
@@ -34,7 +34,7 @@
"koa2-ratelimit": "0.9.1", "koa2-ratelimit": "0.9.1",
"libp2p": "^0.36.2", "libp2p": "^0.36.2",
"line-reader": "0.4.0", "line-reader": "0.4.0",
"minimal-slp-wallet": "4.5.2", "minimal-slp-wallet": "4.5.4",
"mongoose": "5.13.13", "mongoose": "5.13.13",
"node-fetch": "npm:@achingbrain/node-fetch@2.6.7", "node-fetch": "npm:@achingbrain/node-fetch@2.6.7",
"nodemailer": "6.4.17", "nodemailer": "6.4.17",
@@ -1559,9 +1559,9 @@
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@psf/bch-js": { "node_modules/@psf/bch-js": {
"version": "6.2.5", "version": "6.3.1",
"resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.5.tgz", "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.3.1.tgz",
"integrity": "sha512-Obw+i04uIzImkacNrAUZjlO3Fi7SPcDiWkTZPJLsa+YShmICzWpayUSZvP+TgcJBZDH8ikRWxOz4fBA0fPW+iQ==", "integrity": "sha512-Slzq7FJFIWvQ6xhZSm4cnkvPIuFmZNrqtW2IDjZD/aHOX7nZlyQ7Hg4MTbb8CzekUHNroFyKyM36iUU7MaeQmw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@chris.troutner/bip32-utils": "1.0.5", "@chris.troutner/bip32-utils": "1.0.5",
@@ -13895,22 +13895,22 @@
} }
}, },
"node_modules/minimal-slp-wallet": { "node_modules/minimal-slp-wallet": {
"version": "4.5.2", "version": "4.5.4",
"resolved": "http://94.130.170.209:4873/minimal-slp-wallet/-/minimal-slp-wallet-4.5.2.tgz", "resolved": "http://94.130.170.209:4873/minimal-slp-wallet/-/minimal-slp-wallet-4.5.4.tgz",
"integrity": "sha512-aVTzMmEDiWNVVED4S5ixtBjY7Y4sfFmzVM7v6PuH8wU8ceXyZPzVwlJgjC2Lm0o11bToHAPhuT1Ytafr1YkseA==", "integrity": "sha512-CzEe402T4NsFRVoovYQF5Db4lZHYnEQZseYVJMQwghVZ2gV+M69Igmsxj2/rxDGbiVbBSPd7ILMnWmes/BiseA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@psf/bch-js": "6.2.8", "@psf/bch-js": "6.2.14",
"apidoc": "0.51.0", "apidoc": "0.51.0",
"bch-consumer": "1.2.2", "bch-consumer": "1.2.3",
"bch-donation": "1.1.2", "bch-donation": "1.1.2",
"crypto-js": "4.0.0" "crypto-js": "4.0.0"
} }
}, },
"node_modules/minimal-slp-wallet/node_modules/@psf/bch-js": { "node_modules/minimal-slp-wallet/node_modules/@psf/bch-js": {
"version": "6.2.8", "version": "6.2.14",
"resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.8.tgz", "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.14.tgz",
"integrity": "sha512-kJoAeBmdVT6qjwAIlxPDgD1WkCBcAbDsbcwu1fqC0VfcrchuxajAGjqesQDY5bBsCjDKf6/taGC9zl+/pEW+jw==", "integrity": "sha512-tHF2DyBRgYHTvdhVY58dOzbCOuKQrhc9QvYyj+K4c7mfsVgprjU+FTcM9ZFcE3A+0G/92VBP4/kkfccqfdLlWA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@chris.troutner/bip32-utils": "1.0.5", "@chris.troutner/bip32-utils": "1.0.5",
@@ -13939,15 +13939,6 @@
"wif": "2.0.6" "wif": "2.0.6"
} }
}, },
"node_modules/minimal-slp-wallet/node_modules/@psf/bch-js/node_modules/axios": {
"version": "0.26.1",
"resolved": "http://94.130.170.209:4873/axios/-/axios-0.26.1.tgz",
"integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.14.8"
}
},
"node_modules/minimal-slp-wallet/node_modules/apidoc": { "node_modules/minimal-slp-wallet/node_modules/apidoc": {
"version": "0.51.0", "version": "0.51.0",
"resolved": "http://94.130.170.209:4873/apidoc/-/apidoc-0.51.0.tgz", "resolved": "http://94.130.170.209:4873/apidoc/-/apidoc-0.51.0.tgz",
@@ -13998,58 +13989,6 @@
"license": "Python-2.0" "license": "Python-2.0"
}, },
"node_modules/minimal-slp-wallet/node_modules/axios": { "node_modules/minimal-slp-wallet/node_modules/axios": {
"version": "0.25.0",
"resolved": "http://94.130.170.209:4873/axios/-/axios-0.25.0.tgz",
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.14.7"
}
},
"node_modules/minimal-slp-wallet/node_modules/bch-consumer": {
"version": "1.2.2",
"resolved": "http://94.130.170.209:4873/bch-consumer/-/bch-consumer-1.2.2.tgz",
"integrity": "sha512-kLd67+mJcxmNFJG43xRLxVdWutO9sMWIaLyVRAfeQKhH8qnMpaz3jOQ9dFPlM0/kZyTmrDTe5sINsQHFuTGcMA==",
"license": "MIT",
"dependencies": {
"@psf/bch-js": "6.2.4",
"apidoc": "0.51.0",
"axios": "0.25.0"
}
},
"node_modules/minimal-slp-wallet/node_modules/bch-consumer/node_modules/@psf/bch-js": {
"version": "6.2.4",
"resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.4.tgz",
"integrity": "sha512-Vk+uM2cZOjsPKpsDG4U+6YfFPCfhHqUjH48jLrHP1wch78UK6ca8MILdGCH4opEPflHj/T+fLX4RZMtUm8uJAA==",
"license": "MIT",
"dependencies": {
"@chris.troutner/bip32-utils": "1.0.5",
"@psf/bip21": "2.0.1",
"@psf/bitcoincash-ops": "2.0.0",
"@psf/bitcoincashjs-lib": "4.0.2",
"@psf/coininfo": "4.0.0",
"axios": "0.26.1",
"bc-bip68": "1.0.5",
"bchaddrjs-slp": "0.2.5",
"bigi": "1.4.2",
"bignumber.js": "9.0.0",
"bip-schnorr": "0.3.0",
"bip38": "2.0.2",
"bip39": "3.0.2",
"bip66": "1.1.5",
"bitcoinjs-message": "2.0.0",
"bs58": "4.0.1",
"ecashaddrjs": "1.0.7",
"ini": "1.3.8",
"randombytes": "2.0.6",
"safe-buffer": "5.1.2",
"satoshi-bitcoin": "1.0.4",
"slp-mdm": "0.0.6",
"slp-parser": "0.0.4",
"wif": "2.0.6"
}
},
"node_modules/minimal-slp-wallet/node_modules/bch-consumer/node_modules/@psf/bch-js/node_modules/axios": {
"version": "0.26.1", "version": "0.26.1",
"resolved": "http://94.130.170.209:4873/axios/-/axios-0.26.1.tgz", "resolved": "http://94.130.170.209:4873/axios/-/axios-0.26.1.tgz",
"integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
@@ -14058,6 +13997,26 @@
"follow-redirects": "^1.14.8" "follow-redirects": "^1.14.8"
} }
}, },
"node_modules/minimal-slp-wallet/node_modules/bch-consumer": {
"version": "1.2.3",
"resolved": "http://94.130.170.209:4873/bch-consumer/-/bch-consumer-1.2.3.tgz",
"integrity": "sha512-6hMe2RB3PkPG+ZsArSPueUjUL3G/HaONExXbGt5v/wx9iU14A3JmSJJxtpxJ+MMGjDbL9w96EJ3Yrpmn8nDi7A==",
"license": "MIT",
"dependencies": {
"@psf/bch-js": "6.2.14",
"apidoc": "0.51.0",
"axios": "0.25.0"
}
},
"node_modules/minimal-slp-wallet/node_modules/bch-consumer/node_modules/axios": {
"version": "0.25.0",
"resolved": "http://94.130.170.209:4873/axios/-/axios-0.25.0.tgz",
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.14.7"
}
},
"node_modules/minimal-slp-wallet/node_modules/bch-donation": { "node_modules/minimal-slp-wallet/node_modules/bch-donation": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "http://94.130.170.209:4873/bch-donation/-/bch-donation-1.1.2.tgz", "resolved": "http://94.130.170.209:4873/bch-donation/-/bch-donation-1.1.2.tgz",
@@ -24416,9 +24375,9 @@
"version": "1.1.0" "version": "1.1.0"
}, },
"@psf/bch-js": { "@psf/bch-js": {
"version": "6.2.5", "version": "6.3.1",
"resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.5.tgz", "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.3.1.tgz",
"integrity": "sha512-Obw+i04uIzImkacNrAUZjlO3Fi7SPcDiWkTZPJLsa+YShmICzWpayUSZvP+TgcJBZDH8ikRWxOz4fBA0fPW+iQ==", "integrity": "sha512-Slzq7FJFIWvQ6xhZSm4cnkvPIuFmZNrqtW2IDjZD/aHOX7nZlyQ7Hg4MTbb8CzekUHNroFyKyM36iUU7MaeQmw==",
"requires": { "requires": {
"@chris.troutner/bip32-utils": "1.0.5", "@chris.troutner/bip32-utils": "1.0.5",
"@psf/bip21": "2.0.1", "@psf/bip21": "2.0.1",
@@ -33209,21 +33168,21 @@
"dev": true "dev": true
}, },
"minimal-slp-wallet": { "minimal-slp-wallet": {
"version": "4.5.2", "version": "4.5.4",
"resolved": "http://94.130.170.209:4873/minimal-slp-wallet/-/minimal-slp-wallet-4.5.2.tgz", "resolved": "http://94.130.170.209:4873/minimal-slp-wallet/-/minimal-slp-wallet-4.5.4.tgz",
"integrity": "sha512-aVTzMmEDiWNVVED4S5ixtBjY7Y4sfFmzVM7v6PuH8wU8ceXyZPzVwlJgjC2Lm0o11bToHAPhuT1Ytafr1YkseA==", "integrity": "sha512-CzEe402T4NsFRVoovYQF5Db4lZHYnEQZseYVJMQwghVZ2gV+M69Igmsxj2/rxDGbiVbBSPd7ILMnWmes/BiseA==",
"requires": { "requires": {
"@psf/bch-js": "6.2.8", "@psf/bch-js": "6.2.14",
"apidoc": "0.51.0", "apidoc": "0.51.0",
"bch-consumer": "1.2.2", "bch-consumer": "1.2.3",
"bch-donation": "1.1.2", "bch-donation": "1.1.2",
"crypto-js": "4.0.0" "crypto-js": "4.0.0"
}, },
"dependencies": { "dependencies": {
"@psf/bch-js": { "@psf/bch-js": {
"version": "6.2.8", "version": "6.2.14",
"resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.8.tgz", "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.14.tgz",
"integrity": "sha512-kJoAeBmdVT6qjwAIlxPDgD1WkCBcAbDsbcwu1fqC0VfcrchuxajAGjqesQDY5bBsCjDKf6/taGC9zl+/pEW+jw==", "integrity": "sha512-tHF2DyBRgYHTvdhVY58dOzbCOuKQrhc9QvYyj+K4c7mfsVgprjU+FTcM9ZFcE3A+0G/92VBP4/kkfccqfdLlWA==",
"requires": { "requires": {
"@chris.troutner/bip32-utils": "1.0.5", "@chris.troutner/bip32-utils": "1.0.5",
"@psf/bip21": "2.0.1", "@psf/bip21": "2.0.1",
@@ -33249,16 +33208,6 @@
"slp-mdm": "0.0.6", "slp-mdm": "0.0.6",
"slp-parser": "0.0.4", "slp-parser": "0.0.4",
"wif": "2.0.6" "wif": "2.0.6"
},
"dependencies": {
"axios": {
"version": "0.26.1",
"resolved": "http://94.130.170.209:4873/axios/-/axios-0.26.1.tgz",
"integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
"requires": {
"follow-redirects": "^1.14.8"
}
}
} }
}, },
"apidoc": { "apidoc": {
@@ -33296,62 +33245,29 @@
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
}, },
"axios": { "axios": {
"version": "0.25.0", "version": "0.26.1",
"resolved": "http://94.130.170.209:4873/axios/-/axios-0.25.0.tgz", "resolved": "http://94.130.170.209:4873/axios/-/axios-0.26.1.tgz",
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
"requires": { "requires": {
"follow-redirects": "^1.14.7" "follow-redirects": "^1.14.8"
} }
}, },
"bch-consumer": { "bch-consumer": {
"version": "1.2.2", "version": "1.2.3",
"resolved": "http://94.130.170.209:4873/bch-consumer/-/bch-consumer-1.2.2.tgz", "resolved": "http://94.130.170.209:4873/bch-consumer/-/bch-consumer-1.2.3.tgz",
"integrity": "sha512-kLd67+mJcxmNFJG43xRLxVdWutO9sMWIaLyVRAfeQKhH8qnMpaz3jOQ9dFPlM0/kZyTmrDTe5sINsQHFuTGcMA==", "integrity": "sha512-6hMe2RB3PkPG+ZsArSPueUjUL3G/HaONExXbGt5v/wx9iU14A3JmSJJxtpxJ+MMGjDbL9w96EJ3Yrpmn8nDi7A==",
"requires": { "requires": {
"@psf/bch-js": "6.2.4", "@psf/bch-js": "6.2.14",
"apidoc": "0.51.0", "apidoc": "0.51.0",
"axios": "0.25.0" "axios": "0.25.0"
}, },
"dependencies": { "dependencies": {
"@psf/bch-js": { "axios": {
"version": "6.2.4", "version": "0.25.0",
"resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.4.tgz", "resolved": "http://94.130.170.209:4873/axios/-/axios-0.25.0.tgz",
"integrity": "sha512-Vk+uM2cZOjsPKpsDG4U+6YfFPCfhHqUjH48jLrHP1wch78UK6ca8MILdGCH4opEPflHj/T+fLX4RZMtUm8uJAA==", "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
"requires": { "requires": {
"@chris.troutner/bip32-utils": "1.0.5", "follow-redirects": "^1.14.7"
"@psf/bip21": "2.0.1",
"@psf/bitcoincash-ops": "2.0.0",
"@psf/bitcoincashjs-lib": "4.0.2",
"@psf/coininfo": "4.0.0",
"axios": "0.26.1",
"bc-bip68": "1.0.5",
"bchaddrjs-slp": "0.2.5",
"bigi": "1.4.2",
"bignumber.js": "9.0.0",
"bip-schnorr": "0.3.0",
"bip38": "2.0.2",
"bip39": "3.0.2",
"bip66": "1.1.5",
"bitcoinjs-message": "2.0.0",
"bs58": "4.0.1",
"ecashaddrjs": "1.0.7",
"ini": "1.3.8",
"randombytes": "2.0.6",
"safe-buffer": "5.1.2",
"satoshi-bitcoin": "1.0.4",
"slp-mdm": "0.0.6",
"slp-parser": "0.0.4",
"wif": "2.0.6"
},
"dependencies": {
"axios": {
"version": "0.26.1",
"resolved": "http://94.130.170.209:4873/axios/-/axios-0.26.1.tgz",
"integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
"requires": {
"follow-redirects": "^1.14.8"
}
}
} }
} }
} }
+2 -2
View File
@@ -27,7 +27,7 @@
}, },
"repository": "Permissionless-Software-Foundation/bch-dex", "repository": "Permissionless-Software-Foundation/bch-dex",
"dependencies": { "dependencies": {
"@psf/bch-js": "6.2.5", "@psf/bch-js": "6.3.1",
"axios": "0.21.1", "axios": "0.21.1",
"bch-message-lib": "2.2.0", "bch-message-lib": "2.2.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
@@ -52,7 +52,7 @@
"koa2-ratelimit": "0.9.1", "koa2-ratelimit": "0.9.1",
"libp2p": "^0.36.2", "libp2p": "^0.36.2",
"line-reader": "0.4.0", "line-reader": "0.4.0",
"minimal-slp-wallet": "4.5.2", "minimal-slp-wallet": "4.5.4",
"mongoose": "5.13.13", "mongoose": "5.13.13",
"node-fetch": "npm:@achingbrain/node-fetch@2.6.7", "node-fetch": "npm:@achingbrain/node-fetch@2.6.7",
"nodemailer": "6.4.17", "nodemailer": "6.4.17",
+1
View File
@@ -7,6 +7,7 @@ const Offer = new mongoose.Schema({
utxoTxid: { type: String }, utxoTxid: { type: String },
utxoVout: { type: Number }, utxoVout: { type: Number },
ticker: { type: String }, ticker: { type: String },
tokenType: { type: Number },
// Trade data // Trade data
buyOrSell: { type: String }, buyOrSell: { type: String },
+1
View File
@@ -14,6 +14,7 @@ const Order = new mongoose.Schema({
utxoTxid: { type: String }, utxoTxid: { type: String },
utxoVout: { type: Number }, utxoVout: { type: Number },
ticker: { type: String }, ticker: { type: String },
tokenType: { type: Number },
// Trade data // Trade data
buyOrSell: { type: String }, buyOrSell: { type: String },
+32 -7
View File
@@ -208,7 +208,7 @@ class WalletAdapter {
// Get token info on the offered UTXO // Get token info on the offered UTXO
const txData = await this.bchWallet.getTxData([offerInfo.utxoTxid]) const txData = await this.bchWallet.getTxData([offerInfo.utxoTxid])
// console.log(`txData: ${JSON.stringify(txData, null, 2)}`) console.log(`txData: ${JSON.stringify(txData, null, 2)}`)
// Construct the UTXO being offered for sale. // Construct the UTXO being offered for sale.
const offeredUtxo = { const offeredUtxo = {
@@ -222,12 +222,27 @@ class WalletAdapter {
// Build First part of the collaborative Tx a.k.a. Alice // Build First part of the collaborative Tx a.k.a. Alice
// Generate the OP_RETURN code. // Generate the OP_RETURN code.
const slpSendObj = bchjs.SLP.TokenType1.generateSendOpReturn( let slpSendObj
[offeredUtxo], if (offerInfo.tokenType === 65) {
offerInfo.numTokens.toString() // Type 65 NFT
)
slpSendObj = bchjs.SLP.NFT1.generateNFTChildSendOpReturn(
[offeredUtxo],
offerInfo.numTokens.toString()
)
console.log(`slpOutputs: ${slpSendObj.outputs}`)
} else if (offerInfo.tokenType === 1) {
// Type 1 fungible token
slpSendObj = bchjs.SLP.TokenType1.generateSendOpReturn(
[offeredUtxo],
offerInfo.numTokens.toString()
)
console.log(`slpOutputs: ${slpSendObj.outputs}`)
} else {
throw new Error(`Unknown token type of ${offerInfo.tokenType}. Can not create Counter Offer.`)
}
const slpData = slpSendObj.script const slpData = slpSendObj.script
console.log(`slpOutputs: ${slpSendObj.outputs}`)
// Currently this app only supports a single SLP token UTXO for exact // Currently this app only supports a single SLP token UTXO for exact
// token quantities (no token change). e.g. 1 UTXO representing the // token quantities (no token change). e.g. 1 UTXO representing the
@@ -334,12 +349,22 @@ class WalletAdapter {
// Update the UTXO store of the wallet. // Update the UTXO store of the wallet.
await this.bchWallet.getUtxos() await this.bchWallet.getUtxos()
// Get the token type of the token being moved.
// Combine Fungible and NFT token UTXOs.
let tokenUtxos = this.bchWallet.utxos.utxoStore.slpUtxos.type1.tokens.concat(
this.bchWallet.utxos.utxoStore.slpUtxos.nft.tokens)
// Get token UTXOs that match the token in the order.
tokenUtxos = tokenUtxos.filter(
x => x.tokenId === tokenId
)
const txid = await this.bchWallet.sendTokens(receiver, 3) const txid = await this.bchWallet.sendTokens(receiver, 3)
const utxoInfo = { const utxoInfo = {
txid, txid,
vout: 1, vout: 1,
hdIndex: keyPair.hdIndex hdIndex: keyPair.hdIndex,
tokenType: tokenUtxos[0].tokenType
} }
return utxoInfo return utxoInfo
+7 -2
View File
@@ -29,7 +29,8 @@ class OfferEntity {
utxoVout, utxoVout,
offerStatus, offerStatus,
makerAddr, makerAddr,
ticker ticker,
tokenType
} = offerData.data } = offerData.data
// Input Validation // Input Validation
@@ -69,6 +70,9 @@ class OfferEntity {
if (!ticker || typeof ticker !== 'string') { if (!ticker || typeof ticker !== 'string') {
throw new Error("Property 'ticker' must be a string.") throw new Error("Property 'ticker' must be a string.")
} }
if (!tokenType || typeof tokenType !== 'number') {
throw new Error("Property 'tokenType' must be a number.")
}
// Convert the timestamp to a number. // Convert the timestamp to a number.
let timestamp = new Date(offerData.timestamp) let timestamp = new Date(offerData.timestamp)
@@ -91,7 +95,8 @@ class OfferEntity {
p2wdbHash: offerData.hash, p2wdbHash: offerData.hash,
offerStatus: offerStatus || this.offerStatus[0], offerStatus: offerStatus || this.offerStatus[0],
makerAddr, makerAddr,
ticker ticker,
tokenType
} }
return validatedOfferData return validatedOfferData
+8 -3
View File
@@ -65,6 +65,7 @@ class OrderLib {
// Update the order with the new UTXO information. // Update the order with the new UTXO information.
orderEntity.utxoTxid = utxoInfo.txid orderEntity.utxoTxid = utxoInfo.txid
orderEntity.utxoVout = utxoInfo.vout orderEntity.utxoVout = utxoInfo.vout
orderEntity.tokenType = utxoInfo.tokenType
// Add P2WDB specific flag for signaling that this is a new offer. // Add P2WDB specific flag for signaling that this is a new offer.
orderEntity.dataType = 'offer' orderEntity.dataType = 'offer'
@@ -81,6 +82,7 @@ class OrderLib {
// Create a MongoDB model to hold the Order // Create a MongoDB model to hold the Order
orderEntity.hdIndex = utxoInfo.hdIndex orderEntity.hdIndex = utxoInfo.hdIndex
orderEntity.p2wdbHash = hash orderEntity.p2wdbHash = hash
console.log(`creating new order model: ${JSON.stringify(orderEntity, null, 2)}`) console.log(`creating new order model: ${JSON.stringify(orderEntity, null, 2)}`)
const order = new this.OrderModel(orderEntity) const order = new this.OrderModel(orderEntity)
await order.save() await order.save()
@@ -88,7 +90,7 @@ class OrderLib {
return hash return hash
} catch (err) { } catch (err) {
// console.log("Error in use-cases/entry.js/createEntry()", err.message) // console.log("Error in use-cases/entry.js/createEntry()", err.message)
wlogger.error('Error in use-cases/createOrder())') wlogger.error('Error in use-cases/order.js/createOrder())')
console.log('error entryObj: ', entryObj) console.log('error entryObj: ', entryObj)
throw err throw err
} }
@@ -116,11 +118,14 @@ class OrderLib {
if (orderEntity.buyOrSell.includes('sell')) { if (orderEntity.buyOrSell.includes('sell')) {
// Sell Order // Sell Order
// Combine Fungible and NFT token UTXOs.
let tokenUtxos = utxos.slpUtxos.type1.tokens.concat(utxos.slpUtxos.nft.tokens)
// Get token UTXOs that match the token in the order. // Get token UTXOs that match the token in the order.
const tokenUtxos = utxos.slpUtxos.type1.tokens.filter( tokenUtxos = tokenUtxos.filter(
x => x.tokenId === orderEntity.tokenId x => x.tokenId === orderEntity.tokenId
) )
// console.log('tokenUtxos: ', tokenUtxos) console.log('tokenUtxos: ', tokenUtxos)
// Get the total amount of tokens in the wallet that match the token // Get the total amount of tokens in the wallet that match the token
// in the order. // in the order.
+5 -4
View File
@@ -262,10 +262,11 @@ describe('#wallet', () => {
wif: 'L4qKTMCwjH9jHnYtNh9Vsrxj7Hg6zmoN8E2v7N47UKvNVEjw7FU8', wif: 'L4qKTMCwjH9jHnYtNh9Vsrxj7Hg6zmoN8E2v7N47UKvNVEjw7FU8',
hdIndex: 6 hdIndex: 6
}) })
uut.bchWallet = { uut.bchWallet = new MockBchWallet()
sendTokens: async () => 'fake-txid', // uut.bchWallet = {
getUtxos: async () => {} // sendTokens: async () => 'fake-txid',
} // getUtxos: async () => {}
// }
const inObj = { const inObj = {
tokenId: 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2', tokenId: 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2',
+3 -1
View File
@@ -254,7 +254,8 @@ describe('#Offer-Entity', () => {
utxoVout: 0, utxoVout: 0,
offerStatus: 'posted', offerStatus: 'posted',
makerAddr: 'bitcoincash:qzl0d3gcqeypv4cy7gh8rgdszxa9vvm2acv7fqtd00', makerAddr: 'bitcoincash:qzl0d3gcqeypv4cy7gh8rgdszxa9vvm2acv7fqtd00',
ticker: 'TROUT' ticker: 'TROUT',
tokenType: 1
}, },
timestamp: '2021-09-20T17:54:26.395Z', timestamp: '2021-09-20T17:54:26.395Z',
localTimeStamp: '9/20/2021, 10:54:26 AM', localTimeStamp: '9/20/2021, 10:54:26 AM',
@@ -279,6 +280,7 @@ describe('#Offer-Entity', () => {
assert.property(result, 'localTimestamp') assert.property(result, 'localTimestamp')
assert.property(result, 'txid') assert.property(result, 'txid')
assert.property(result, 'p2wdbHash') assert.property(result, 'p2wdbHash')
assert.property(result, 'tokenType')
}) })
}) })
}) })
+4 -2
View File
@@ -127,9 +127,11 @@ class MockBchWallet {
] ]
}, },
nft: { nft: {
groupMintBatons: [],
groupTokens: [],
tokens: [] tokens: []
},
group: {
tokens: [],
mintBatons: []
} }
} }
} }
+2 -1
View File
@@ -96,7 +96,8 @@ describe('#offer-use-case', () => {
'241c06bf61384b8623477e419bf4779edbcc7e3bc862f0f179a9ed2967069b87', '241c06bf61384b8623477e419bf4779edbcc7e3bc862f0f179a9ed2967069b87',
utxoVout: 0, utxoVout: 0,
makerAddr: 'bitcoincash:qzl0d3gcqeypv4cy7gh8rgdszxa9vvm2acv7fqtd00', makerAddr: 'bitcoincash:qzl0d3gcqeypv4cy7gh8rgdszxa9vvm2acv7fqtd00',
ticker: 'TROUT' ticker: 'TROUT',
tokenType: 1
}, },
timestamp: '2021-09-20T17:54:26.395Z', timestamp: '2021-09-20T17:54:26.395Z',
localTimeStamp: '9/20/2021, 10:54:26 AM', localTimeStamp: '9/20/2021, 10:54:26 AM',