diff --git a/config-overrides.js b/config-overrides.js
new file mode 100644
index 0000000..62b24b0
--- /dev/null
+++ b/config-overrides.js
@@ -0,0 +1,18 @@
+const webpack = require('webpack');
+
+module.exports = function override(config) {
+ config.resolve.fallback = {
+ ...config.resolve.fallback,
+ crypto: require.resolve('crypto-browserify'),
+ stream: require.resolve('stream-browserify'),
+ vm: require.resolve('vm-browserify'),
+ };
+
+ config.plugins = (config.plugins || []).concat([
+ new webpack.ProvidePlugin({
+ process: 'process/browser',
+ }),
+ ]);
+
+ return config;
+};
diff --git a/package-lock.json b/package-lock.json
index dcbabd8..f7209e8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "bch-wallet-web3-spa",
+ "name": "bch-dex-taker-v2",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "bch-wallet-web3-spa",
+ "name": "bch-dex-taker-v2",
"version": "1.0.0",
"dependencies": {
"@chris.troutner/react-jdenticon": "1.0.1",
@@ -14,8 +14,11 @@
"@fortawesome/free-solid-svg-icons": "6.7.2",
"@fortawesome/react-fontawesome": "0.2.2",
"axios": "0.27.2",
+ "bch-dex-lib": "2.0.2",
"bch-message-lib": "2.2.1",
"bootstrap": "5.2.0",
+ "crypto-browserify": "3.12.1",
+ "process": "^0.11.10",
"qrcode.react": "4.2.0",
"query-string": "7.1.1",
"react": "19.0.0",
@@ -23,11 +26,14 @@
"react-dom": "19.0.0",
"react-router-dom": "7.1.3",
"react-scripts": "5.0.1",
+ "stream-browserify": "^3.0.0",
"use-local-storage-state": "19.5.0",
- "use-query-params": "1.2.3"
+ "use-query-params": "1.2.3",
+ "vm-browserify": "1.1.2"
},
"devDependencies": {
"minimal-slp-wallet": "5.8.5",
+ "react-app-rewired": "^2.2.1",
"standard": "17.0.0",
"web3.storage": "4.3.0"
}
@@ -1770,6 +1776,23 @@
"node": ">=10.15.1"
}
},
+ "node_modules/@chris.troutner/nostr-tools": {
+ "version": "2.10.4",
+ "resolved": "http://94.130.170.209:4873/@chris.troutner%2fnostr-tools/-/nostr-tools-2.10.4.tgz",
+ "integrity": "sha512-e8AYJ0yQ0O3bvnuXQUIdB+P3W7f06st+TXfmbpd6U7IpJ5jWhczoLGvF0NiCgKB6YHTaTGx4hoRLF2A744PzmQ==",
+ "license": "Unlicense",
+ "dependencies": {
+ "@noble/ciphers": "^0.5.1",
+ "@noble/curves": "1.2.0",
+ "@noble/hashes": "1.3.1",
+ "@scure/base": "1.1.1",
+ "@scure/bip32": "1.3.1",
+ "@scure/bip39": "1.2.1"
+ },
+ "optionalDependencies": {
+ "nostr-wasm": "0.1.0"
+ }
+ },
"node_modules/@chris.troutner/react-jdenticon": {
"version": "1.0.1",
"resolved": "http://94.130.170.209:4873/@chris.troutner%2freact-jdenticon/-/react-jdenticon-1.0.1.tgz",
@@ -1783,6 +1806,16 @@
"react": ">= 18"
}
},
+ "node_modules/@chris.troutner/retry-queue": {
+ "version": "1.0.10",
+ "resolved": "http://94.130.170.209:4873/@chris.troutner%2fretry-queue/-/retry-queue-1.0.10.tgz",
+ "integrity": "sha512-iF+xQl3jyTATAKDVkwY85j4Npihh/MqG99bjrS0cNJDF0XQeUSMVGsdtXR6TFj8YcEgfPvgBdYGOtEFo6tTQpA==",
+ "license": "MIT",
+ "dependencies": {
+ "p-queue": "7.3.0",
+ "p-retry": "5.1.1"
+ }
+ },
"node_modules/@chris.troutner/retry-queue-commonjs": {
"version": "1.0.8",
"license": "MIT",
@@ -1791,6 +1824,44 @@
"p-retry": "4.6.2"
}
},
+ "node_modules/@chris.troutner/retry-queue/node_modules/@types/retry": {
+ "version": "0.12.1",
+ "resolved": "http://94.130.170.209:4873/@types%2fretry/-/retry-0.12.1.tgz",
+ "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
+ "license": "MIT"
+ },
+ "node_modules/@chris.troutner/retry-queue/node_modules/p-queue": {
+ "version": "7.3.0",
+ "resolved": "http://94.130.170.209:4873/p-queue/-/p-queue-7.3.0.tgz",
+ "integrity": "sha512-5fP+yVQ0qp0rEfZoDTlP2c3RYBgxvRsw30qO+VtPPc95lyvSG+x6USSh1TuLB4n96IO6I8/oXQGsTgtna4q2nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.7",
+ "p-timeout": "^5.0.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@chris.troutner/retry-queue/node_modules/p-retry": {
+ "version": "5.1.1",
+ "resolved": "http://94.130.170.209:4873/p-retry/-/p-retry-5.1.1.tgz",
+ "integrity": "sha512-i69WkEU5ZAL8mrmdmVviWwU+DN+IUF8f4sSJThoJ3z5A7Nn5iuO5ROX3Boye0u+uYQLOSfgFl7SuFZCjlAVbQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/retry": "0.12.1",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@colors/colors": {
"version": "1.5.0",
"license": "MIT",
@@ -2849,6 +2920,39 @@
"murmurhash3js-revisited": "^3.0.0"
}
},
+ "node_modules/@noble/ciphers": {
+ "version": "0.5.3",
+ "resolved": "http://94.130.170.209:4873/@noble%2fciphers/-/ciphers-0.5.3.tgz",
+ "integrity": "sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@noble/curves": {
+ "version": "1.2.0",
+ "resolved": "http://94.130.170.209:4873/@noble%2fcurves/-/curves-1.2.0.tgz",
+ "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "1.3.2"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@noble/curves/node_modules/@noble/hashes": {
+ "version": "1.3.2",
+ "resolved": "http://94.130.170.209:4873/@noble%2fhashes/-/hashes-1.3.2.tgz",
+ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@noble/ed25519": {
"version": "1.6.0",
"dev": true,
@@ -2860,6 +2964,18 @@
],
"license": "MIT"
},
+ "node_modules/@noble/hashes": {
+ "version": "1.3.1",
+ "resolved": "http://94.130.170.209:4873/@noble%2fhashes/-/hashes-1.3.1.tgz",
+ "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@noble/secp256k1": {
"version": "1.6.0",
"dev": true,
@@ -3235,6 +3351,57 @@
"version": "1.1.3",
"license": "MIT"
},
+ "node_modules/@scure/base": {
+ "version": "1.1.1",
+ "resolved": "http://94.130.170.209:4873/@scure%2fbase/-/base-1.1.1.tgz",
+ "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@scure/bip32": {
+ "version": "1.3.1",
+ "resolved": "http://94.130.170.209:4873/@scure%2fbip32/-/bip32-1.3.1.tgz",
+ "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/curves": "~1.1.0",
+ "@noble/hashes": "~1.3.1",
+ "@scure/base": "~1.1.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip32/node_modules/@noble/curves": {
+ "version": "1.1.0",
+ "resolved": "http://94.130.170.209:4873/@noble%2fcurves/-/curves-1.1.0.tgz",
+ "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "1.3.1"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip39": {
+ "version": "1.2.1",
+ "resolved": "http://94.130.170.209:4873/@scure%2fbip39/-/bip39-1.2.1.tgz",
+ "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "~1.3.0",
+ "@scure/base": "~1.1.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@sinclair/typebox": {
"version": "0.23.5",
"license": "MIT"
@@ -4603,6 +4770,17 @@
"version": "2.0.6",
"license": "MIT"
},
+ "node_modules/asn1.js": {
+ "version": "4.10.1",
+ "resolved": "http://94.130.170.209:4873/asn1.js/-/asn1.js-4.10.1.tgz",
+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
"node_modules/ast-types-flow": {
"version": "0.0.7",
"license": "ISC"
@@ -4971,6 +5149,15 @@
"safe-buffer": "^5.0.1"
}
},
+ "node_modules/base58-js": {
+ "version": "2.0.0",
+ "resolved": "http://94.130.170.209:4873/base58-js/-/base58-js-2.0.0.tgz",
+ "integrity": "sha512-nAV5d32QXuGcGptSApkKpC1gGakWBnfJMNjKrYTBh4tb0szfZF+ooueFLy8T4VrY+o4SrE/TyrtUnRZcwZchaA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/base64-js": {
"version": "1.5.1",
"dev": true,
@@ -5017,6 +5204,16 @@
"follow-redirects": "^1.14.7"
}
},
+ "node_modules/bch-dex-lib": {
+ "version": "2.0.2",
+ "resolved": "http://94.130.170.209:4873/bch-dex-lib/-/bch-dex-lib-2.0.2.tgz",
+ "integrity": "sha512-x639TqYjRucvFrWzr9PMWN5Jdj2+lJkk1m4LC9Zlfm0QNe1PLD4WqyqH1dxMUdA/L9TVpPq1V/HbAiiQZmjV6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@chris.troutner/retry-queue": "1.0.10",
+ "bch-nostr": "1.3.4"
+ }
+ },
"node_modules/bch-donation": {
"version": "1.1.2",
"license": "MIT",
@@ -5031,6 +5228,100 @@
"minimal-slp-wallet": ">= 4"
}
},
+ "node_modules/bch-nostr": {
+ "version": "1.3.4",
+ "resolved": "http://94.130.170.209:4873/bch-nostr/-/bch-nostr-1.3.4.tgz",
+ "integrity": "sha512-5R6PtZsP1F+oDs7+sZ5d+DeM3XNhr+3QsyHmTbFdoyNcb3w0vFN3KYNvaXpfPYBUDncXPJBNSR5GOstEDRSCgg==",
+ "license": "MIT",
+ "dependencies": {
+ "@chris.troutner/nostr-tools": "2.10.4",
+ "apidoc": "0.53.0",
+ "base58-js": "2.0.0",
+ "bch-message-lib": "2.3.1",
+ "nostr": "0.2.8",
+ "ws": "8.18.0"
+ }
+ },
+ "node_modules/bch-nostr/node_modules/apidoc": {
+ "version": "0.53.0",
+ "resolved": "http://94.130.170.209:4873/apidoc/-/apidoc-0.53.0.tgz",
+ "integrity": "sha512-H4hYToCrI6TgSksdVHxS7h5/Xoqr/rR9m9/IOQaYqXbX07cPVbg0O3RM4+bR4tJKG1aqBWKKm+xojQ8+4i7O5A==",
+ "license": "MIT",
+ "os": [
+ "darwin",
+ "freebsd",
+ "linux",
+ "openbsd",
+ "win32"
+ ],
+ "dependencies": {
+ "bootstrap": "3.4.1",
+ "commander": "^8.3.0",
+ "diff-match-patch": "^1.0.5",
+ "esbuild-loader": "^2.16.0",
+ "expose-loader": "^3.1.0",
+ "fs-extra": "^10.0.0",
+ "glob": "^7.2.0",
+ "handlebars": "^4.7.7",
+ "iconv-lite": "^0.6.3",
+ "jquery": "^3.6.0",
+ "klaw-sync": "^6.0.0",
+ "lodash": "^4.17.21",
+ "markdown-it": "^12.2.0",
+ "nodemon": "^2.0.15",
+ "prismjs": "^1.25.0",
+ "semver": "^7.3.5",
+ "style-loader": "^3.3.1",
+ "webpack": "^5.64.2",
+ "webpack-cli": "^4.9.1",
+ "winston": "^3.3.3"
+ },
+ "bin": {
+ "apidoc": "bin/apidoc"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/bch-nostr/node_modules/bch-message-lib": {
+ "version": "2.3.1",
+ "resolved": "http://94.130.170.209:4873/bch-message-lib/-/bch-message-lib-2.3.1.tgz",
+ "integrity": "sha512-xAWMRvmcP2mYTdp9KgjSQfxlJF4DTloCJrjGx0TumD3HPF9mmYZ/CiCGUAFdQk3LBCavnK0AZi9v3+JTNSnrcA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "minimal-slp-wallet": ">= 5"
+ }
+ },
+ "node_modules/bch-nostr/node_modules/bootstrap": {
+ "version": "3.4.1",
+ "resolved": "http://94.130.170.209:4873/bootstrap/-/bootstrap-3.4.1.tgz",
+ "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/bch-nostr/node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "http://94.130.170.209:4873/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/bchaddrjs-slp": {
"version": "0.2.5",
"license": "MIT",
@@ -5322,6 +5613,165 @@
"safe-buffer": "^5.0.1"
}
},
+ "node_modules/browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "http://94.130.170.209:4873/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "license": "MIT",
+ "dependencies": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "node_modules/browserify-des": {
+ "version": "1.0.2",
+ "resolved": "http://94.130.170.209:4873/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/browserify-rsa": {
+ "version": "4.1.1",
+ "resolved": "http://94.130.170.209:4873/browserify-rsa/-/browserify-rsa-4.1.1.tgz",
+ "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^5.2.1",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/browserify-rsa/node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "http://94.130.170.209:4873/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "license": "MIT"
+ },
+ "node_modules/browserify-rsa/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "http://94.130.170.209:4873/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/browserify-sign": {
+ "version": "4.2.3",
+ "resolved": "http://94.130.170.209:4873/browserify-sign/-/browserify-sign-4.2.3.tgz",
+ "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==",
+ "license": "ISC",
+ "dependencies": {
+ "bn.js": "^5.2.1",
+ "browserify-rsa": "^4.1.0",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.5",
+ "hash-base": "~3.0",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.7",
+ "readable-stream": "^2.3.8",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "http://94.130.170.209:4873/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "license": "MIT"
+ },
+ "node_modules/browserify-sign/node_modules/hash-base": {
+ "version": "3.0.5",
+ "resolved": "http://94.130.170.209:4873/hash-base/-/hash-base-3.0.5.tgz",
+ "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "http://94.130.170.209:4873/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "http://94.130.170.209:4873/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/browserify-sign/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "http://94.130.170.209:4873/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/browserify-sign/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "http://94.130.170.209:4873/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "http://94.130.170.209:4873/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
"node_modules/browserslist": {
"version": "4.20.4",
"funding": [
@@ -5979,6 +6429,16 @@
"node": ">=10"
}
},
+ "node_modules/create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "http://94.130.170.209:4873/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
"node_modules/create-hash": {
"version": "1.2.0",
"license": "MIT",
@@ -6014,6 +6474,65 @@
"node": ">= 8"
}
},
+ "node_modules/crypto-browserify": {
+ "version": "3.12.1",
+ "resolved": "http://94.130.170.209:4873/crypto-browserify/-/crypto-browserify-3.12.1.tgz",
+ "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserify-cipher": "^1.0.1",
+ "browserify-sign": "^4.2.3",
+ "create-ecdh": "^4.0.4",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "diffie-hellman": "^5.0.3",
+ "hash-base": "~3.0.4",
+ "inherits": "^2.0.4",
+ "pbkdf2": "^3.1.2",
+ "public-encrypt": "^4.0.3",
+ "randombytes": "^2.1.0",
+ "randomfill": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/crypto-browserify/node_modules/hash-base": {
+ "version": "3.0.5",
+ "resolved": "http://94.130.170.209:4873/hash-base/-/hash-base-3.0.5.tgz",
+ "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/crypto-browserify/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "http://94.130.170.209:4873/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/crypto-js": {
"version": "4.0.0",
"license": "MIT"
@@ -6562,6 +7081,16 @@
"node": ">=6"
}
},
+ "node_modules/des.js": {
+ "version": "1.1.0",
+ "resolved": "http://94.130.170.209:4873/des.js/-/des.js-1.1.0.tgz",
+ "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
"node_modules/destroy": {
"version": "1.2.0",
"license": "MIT",
@@ -6637,6 +7166,17 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
+ "node_modules/diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "http://94.130.170.209:4873/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
"node_modules/dir-glob": {
"version": "3.0.1",
"license": "MIT",
@@ -6864,7 +7404,9 @@
"license": "ISC"
},
"node_modules/elliptic": {
- "version": "6.5.4",
+ "version": "6.6.1",
+ "resolved": "http://94.130.170.209:4873/elliptic/-/elliptic-6.6.1.tgz",
+ "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==",
"license": "MIT",
"dependencies": {
"bn.js": "^4.11.9",
@@ -12606,6 +13148,19 @@
"node": ">=8.6"
}
},
+ "node_modules/miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "http://94.130.170.209:4873/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
"node_modules/mime": {
"version": "1.6.0",
"license": "MIT",
@@ -12894,6 +13449,13 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/noble-secp256k1": {
+ "version": "1.2.14",
+ "resolved": "http://94.130.170.209:4873/noble-secp256k1/-/noble-secp256k1-1.2.14.tgz",
+ "integrity": "sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==",
+ "deprecated": "Switch to namespaced @noble/secp256k1 for security and feature updates",
+ "license": "MIT"
+ },
"node_modules/node-addon-api": {
"version": "2.0.2",
"license": "MIT"
@@ -13022,6 +13584,44 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/nostr": {
+ "version": "0.2.8",
+ "resolved": "http://94.130.170.209:4873/nostr/-/nostr-0.2.8.tgz",
+ "integrity": "sha512-p25OQiEB5x8rWWoWLRRbxtxQiaQgypaQQakSKw5+cp/SW0DXea/soMzqmTXei1I6HrcARuyfvedGTdoEU471Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "noble-secp256k1": "^1.2.14",
+ "ws": "^8.8.1"
+ }
+ },
+ "node_modules/nostr-wasm": {
+ "version": "0.1.0",
+ "resolved": "http://94.130.170.209:4873/nostr-wasm/-/nostr-wasm-0.1.0.tgz",
+ "integrity": "sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/nostr/node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "http://94.130.170.209:4873/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/npm-run-path": {
"version": "4.0.1",
"license": "MIT",
@@ -13319,6 +13919,18 @@
"node": ">=8"
}
},
+ "node_modules/p-timeout": {
+ "version": "5.1.0",
+ "resolved": "http://94.130.170.209:4873/p-timeout/-/p-timeout-5.1.0.tgz",
+ "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/p-try": {
"version": "2.2.0",
"license": "MIT",
@@ -13344,6 +13956,56 @@
"node": ">=6"
}
},
+ "node_modules/parse-asn1": {
+ "version": "5.1.7",
+ "resolved": "http://94.130.170.209:4873/parse-asn1/-/parse-asn1-5.1.7.tgz",
+ "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==",
+ "license": "ISC",
+ "dependencies": {
+ "asn1.js": "^4.10.1",
+ "browserify-aes": "^1.2.0",
+ "evp_bytestokey": "^1.0.3",
+ "hash-base": "~3.0",
+ "pbkdf2": "^3.1.2",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse-asn1/node_modules/hash-base": {
+ "version": "3.0.5",
+ "resolved": "http://94.130.170.209:4873/hash-base/-/hash-base-3.0.5.tgz",
+ "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse-asn1/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "http://94.130.170.209:4873/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/parse-duration": {
"version": "1.0.2",
"dev": true,
@@ -14781,6 +15443,15 @@
"node": ">=6"
}
},
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "http://94.130.170.209:4873/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"license": "MIT"
@@ -14874,6 +15545,20 @@
"version": "1.1.8",
"license": "MIT"
},
+ "node_modules/public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "http://94.130.170.209:4873/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
"node_modules/punycode": {
"version": "2.1.1",
"license": "MIT",
@@ -14996,6 +15681,16 @@
"safe-buffer": "^5.1.0"
}
},
+ "node_modules/randomfill": {
+ "version": "1.0.4",
+ "resolved": "http://94.130.170.209:4873/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "license": "MIT",
+ "dependencies": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
"node_modules/range-parser": {
"version": "1.2.1",
"license": "MIT",
@@ -15055,6 +15750,32 @@
"node": ">=14"
}
},
+ "node_modules/react-app-rewired": {
+ "version": "2.2.1",
+ "resolved": "http://94.130.170.209:4873/react-app-rewired/-/react-app-rewired-2.2.1.tgz",
+ "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^5.6.0"
+ },
+ "bin": {
+ "react-app-rewired": "bin/index.js"
+ },
+ "peerDependencies": {
+ "react-scripts": ">=2.1.3"
+ }
+ },
+ "node_modules/react-app-rewired/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "http://94.130.170.209:4873/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
"node_modules/react-bootstrap": {
"version": "2.10.7",
"license": "MIT",
@@ -16570,6 +17291,16 @@
"node": ">= 0.4"
}
},
+ "node_modules/stream-browserify": {
+ "version": "3.0.0",
+ "resolved": "http://94.130.170.209:4873/stream-browserify/-/stream-browserify-3.0.0.tgz",
+ "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "~2.0.4",
+ "readable-stream": "^3.5.0"
+ }
+ },
"node_modules/stream-to-it": {
"version": "0.2.4",
"dev": true,
@@ -17641,6 +18372,12 @@
"node": ">= 0.8"
}
},
+ "node_modules/vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "http://94.130.170.209:4873/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "license": "MIT"
+ },
"node_modules/w3c-hr-time": {
"version": "1.0.2",
"license": "MIT",
diff --git a/package.json b/package.json
index 7e86069..bc3f282 100644
--- a/package.json
+++ b/package.json
@@ -8,8 +8,11 @@
"@fortawesome/free-solid-svg-icons": "6.7.2",
"@fortawesome/react-fontawesome": "0.2.2",
"axios": "0.27.2",
+ "bch-dex-lib": "2.0.2",
"bch-message-lib": "2.2.1",
"bootstrap": "5.2.0",
+ "crypto-browserify": "3.12.1",
+ "process": "^0.11.10",
"qrcode.react": "4.2.0",
"query-string": "7.1.1",
"react": "19.0.0",
@@ -17,14 +20,16 @@
"react-dom": "19.0.0",
"react-router-dom": "7.1.3",
"react-scripts": "5.0.1",
+ "stream-browserify": "^3.0.0",
"use-local-storage-state": "19.5.0",
- "use-query-params": "1.2.3"
+ "use-query-params": "1.2.3",
+ "vm-browserify": "1.1.2"
},
"scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test",
- "eject": "react-scripts eject",
+ "start": "react-app-rewired start",
+ "build": "react-app-rewired build",
+ "test": "react-app-rewired test",
+ "eject": "react-app-rewired eject",
"lint": "standard --env mocha --fix",
"pub": "node deploy/publish-main.js",
"pub:ghp": "./deploy/publish-gh-pages.sh"
@@ -46,6 +51,7 @@
},
"devDependencies": {
"minimal-slp-wallet": "5.8.5",
+ "react-app-rewired": "^2.2.1",
"standard": "17.0.0",
"web3.storage": "4.3.0"
}
diff --git a/src/components/app-body/nfts-for-sale/index.js b/src/components/app-body/nfts-for-sale/index.js
index af1f055..becb772 100644
--- a/src/components/app-body/nfts-for-sale/index.js
+++ b/src/components/app-body/nfts-for-sale/index.js
@@ -9,6 +9,7 @@ import axios from 'axios'
import Jdenticon from '@chris.troutner/react-jdenticon'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faRedo } from '@fortawesome/free-solid-svg-icons'
+import BchDexLib from 'bch-dex-lib'
// import RetryQueue from '@chris.troutner/retry-queue'
// Local libraries
@@ -38,6 +39,14 @@ function NftsForSale (props) {
const rawOffers = result.data
const bchjs = appData.wallet.bchjs
+ const wallet = appData.wallet
+
+ // Instantiate the BchDexLib object.
+ const dexLib = new BchDexLib({bchWallet: wallet, p2wdbRead: {}, p2wdbWrite: {}})
+
+ const offerDataCallback = (offer) => {
+ console.log('offerDataCallback() offer: ', offer)
+ }
// Add a default icon.
for (let i = 0; i < rawOffers.length; i++) {
@@ -57,6 +66,9 @@ function NftsForSale (props) {
// console.log(`usdPrice: ${usdPrice}`)
const priceStr = `$${usdPrice.toFixed(3)}`
thisOffer.usdPrice = priceStr
+
+ // Download token data
+ await dexLib.tokenData.getTokenData(thisOffer, offerDataCallback)
}
return rawOffers
@@ -90,7 +102,7 @@ function NftsForSale (props) {
// Load NFT data when the page loads from the server or from the cache.
useEffect(() => {
asyncStartup()
- }, [offers])
+ }, [])
// This function generates a Token Card for each token in the wallet.
function generateCards () {
diff --git a/src/components/app-body/nfts-for-sale/info-button.js b/src/components/app-body/nfts-for-sale/info-button.js
new file mode 100644
index 0000000..da71b68
--- /dev/null
+++ b/src/components/app-body/nfts-for-sale/info-button.js
@@ -0,0 +1,94 @@
+/*
+ This component renders as a button. When clicked, it opens a modal that
+ displays information about the token.
+
+ This is a functional component with as little state as possible.
+*/
+
+// Global npm libraries
+import React, { useState } from 'react'
+import { Button, Modal, Container, Row, Col } from 'react-bootstrap'
+
+function InfoButton (props) {
+ const [show, setShow] = useState(false)
+
+ const handleClose = () => {
+ console.log('handleClose()')
+ setShow(false)
+ // props.instance.setState({ showModal: false })
+ }
+
+ const handleOpen = () => {
+ console.log('handleOpen()')
+ setShow(true)
+ }
+
+ console.log('props.token: ', props.token)
+
+ // Replace with dummy button until token data is loaded.
+ if (!props.token.tokenData) {
+ return (
+ <>
+
+ >
+ )
+ }
+
+ // Convert the url property of the token to a link, if it matches common patterns.
+ // let url = props.token.tokenurl
+ // url = linkIfUrl(props.token.url)
+
+ // console.log('props.token: ', props.token)
+
+ return (
+ <>
+
+
buttons here
+