diff --git a/package-lock.json b/package-lock.json index de56b96..5846198 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,16 @@ { "name": "@psf/bch-js", - "version": "6.0.0", + "version": "7.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@psf/bch-js", - "version": "6.0.0", + "version": "7.0.0", "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.3", "@psf/coininfo": "4.0.0", "axios": "1.13.2", diff --git a/package.json b/package.json index 609ffd4..7af6ea9 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,13 @@ ], "main": "src/bch-js.js", "scripts": { - "test": "c8 mocha --trace-warnings --unhandled-rejections=strict --timeout 30000 test/unit/", + "test": "export RESTURL=http://localhost:5942/v6 && c8 mocha --trace-warnings --unhandled-rejections=strict --timeout 30000 test/unit/", "test:integration": "npm run test:integration:local:noauth", - "test:integration:nft": "export RESTURL=https://bchn.fullstack.cash/v6/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 -g '#nft1' test/integration/slp.js", "test:integration:bchn": "export RESTURL=https://bchn.fullstack.cash/v6/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 test/integration/", - "test:integration:local:noauth": "export RESTURL=http://localhost:5942/v6/ && mocha --timeout 30000 test/integration/", - "test:integration:local:auth": "export RESTURL=http://5.78.147.3:5942/v6/ && export BCHJSBEARERTOKEN=temp01 && mocha --timeout 30000 test/integration/", - "test:integration:decatur": "export RESTURL=http://192.168.2.127:5942/v6/ && mocha --timeout 30000 test/integration/", - "test:integration:x402": "export RESTURL=http://localhost:5942/v6/ && export BCHJSWIF=L1eYaneXDDXy8VDig4Arwe8wYHbhtsA5wuQvwsKwhaYeneoZuKG4 && mocha --timeout 30000 test/integration/", + "test:integration:local:noauth": "export RESTURL=http://localhost:5942/v6 && mocha --timeout 30000 test/integration/", + "test:integration:local:auth": "export RESTURL=http://5.78.147.3:5942/v6 && export BCHJSBEARERTOKEN=temp01 && mocha --timeout 30000 test/integration/", + "test:integration:decatur": "export RESTURL=http://192.168.2.127:5942/v6 && mocha --timeout 30000 test/integration/", + "test:integration:x402": "export RESTURL=http://localhost:5942/v6 && export BCHJSWIF=L1eYaneXDDXy8VDig4Arwe8wYHbhtsA5wuQvwsKwhaYeneoZuKG4 && mocha --timeout 30000 test/integration/", "coverage": "nyc --reporter=html mocha --timeout 25000 test/unit/", "docs": "./node_modules/.bin/apidoc -i src/ -o docs && ./fix-docs-contrast.sh", "lint": "standard --env mocha --fix" @@ -31,7 +30,6 @@ "dependencies": { "@chris.troutner/bip32-utils": "1.0.5", "@psf/bip21": "2.0.1", - "@psf/bitcoincash-ops": "2.0.0", "@psf/bitcoincashjs-lib": "4.0.3", "@psf/coininfo": "4.0.0", "axios": "1.13.2", diff --git a/src/bch-js.js b/src/bch-js.js index 8df5fb0..5b11c22 100644 --- a/src/bch-js.js +++ b/src/bch-js.js @@ -45,7 +45,6 @@ import Ecash from './ecash.js' // Indexers import Electrumx from './electrumx.js' import PsfSlpIndexer from './psf-slp-indexer.js' -const DEFAULT_REST_API = 'https://api.fullstack.cash/v6/' class BCHJS { constructor (config) { @@ -54,7 +53,16 @@ class BCHJS { this.restURL = config.restURL } else if (process.env.RESTURL && process.env.RESTURL !== '') { this.restURL = process.env.RESTURL - } else this.restURL = DEFAULT_REST_API + } else { + throw new Error( + 'REST API URL is required. Provide config.restURL or set the RESTURL environment variable.' + ) + } + + // Normalize restURL to always have a trailing slash + if (!this.restURL.endsWith('/')) { + this.restURL = this.restURL + '/' + } // Retrieve the Bearer token for simple token authentication. this.bearerToken = '' // default value. diff --git a/src/price.js b/src/price.js index 7633cc5..3845187 100644 --- a/src/price.js +++ b/src/price.js @@ -40,7 +40,7 @@ class Price { async getUsd () { try { const response = await this.axios.get( - `${this.restURL}price/usd`, + `${this.restURL}price/bchusd`, this.axiosOptions ) // console.log(`response.data: ${JSON.stringify(response.data, null, 2)}`) diff --git a/src/script.js b/src/script.js index 2f039fc..36e8c72 100644 --- a/src/script.js +++ b/src/script.js @@ -1,7 +1,130 @@ import Bitcoin from '@psf/bitcoincashjs-lib' -import { createRequire } from 'module' -const require = createRequire(import.meta.url) -const opcodes = require('@psf/bitcoincash-ops') + +// Inline opcodes data to avoid fs/import.meta issues in browser builds. +// This data is from @psf/bitcoincash-ops/index.json +const opcodes = { + OP_FALSE: 0, + OP_0: 0, + OP_PUSHDATA1: 76, + OP_PUSHDATA2: 77, + OP_PUSHDATA4: 78, + OP_1NEGATE: 79, + OP_RESERVED: 80, + OP_TRUE: 81, + OP_1: 81, + OP_2: 82, + OP_3: 83, + OP_4: 84, + OP_5: 85, + OP_6: 86, + OP_7: 87, + OP_8: 88, + OP_9: 89, + OP_10: 90, + OP_11: 91, + OP_12: 92, + OP_13: 93, + OP_14: 94, + OP_15: 95, + OP_16: 96, + OP_NOP: 97, + OP_VER: 98, + OP_IF: 99, + OP_NOTIF: 100, + OP_VERIF: 101, + OP_VERNOTIF: 102, + OP_ELSE: 103, + OP_ENDIF: 104, + OP_VERIFY: 105, + OP_RETURN: 106, + OP_TOALTSTACK: 107, + OP_FROMALTSTACK: 108, + OP_2DROP: 109, + OP_2DUP: 110, + OP_3DUP: 111, + OP_2OVER: 112, + OP_2ROT: 113, + OP_2SWAP: 114, + OP_IFDUP: 115, + OP_DEPTH: 116, + OP_DROP: 117, + OP_DUP: 118, + OP_NIP: 119, + OP_OVER: 120, + OP_PICK: 121, + OP_ROLL: 122, + OP_ROT: 123, + OP_SWAP: 124, + OP_TUCK: 125, + OP_CAT: 126, + OP_SPLIT: 127, + OP_NUM2BIN: 128, + OP_BIN2NUM: 129, + OP_SIZE: 130, + OP_INVERT: 131, + OP_AND: 132, + OP_OR: 133, + OP_XOR: 134, + OP_EQUAL: 135, + OP_EQUALVERIFY: 136, + OP_RESERVED1: 137, + OP_RESERVED2: 138, + OP_1ADD: 139, + OP_1SUB: 140, + OP_2MUL: 141, + OP_2DIV: 142, + OP_NEGATE: 143, + OP_ABS: 144, + OP_NOT: 145, + OP_0NOTEQUAL: 146, + OP_ADD: 147, + OP_SUB: 148, + OP_MUL: 149, + OP_DIV: 150, + OP_MOD: 151, + OP_LSHIFT: 152, + OP_RSHIFT: 153, + OP_BOOLAND: 154, + OP_BOOLOR: 155, + OP_NUMEQUAL: 156, + OP_NUMEQUALVERIFY: 157, + OP_NUMNOTEQUAL: 158, + OP_LESSTHAN: 159, + OP_GREATERTHAN: 160, + OP_LESSTHANOREQUAL: 161, + OP_GREATERTHANOREQUAL: 162, + OP_MIN: 163, + OP_MAX: 164, + OP_WITHIN: 165, + OP_RIPEMD160: 166, + OP_SHA1: 167, + OP_SHA256: 168, + OP_HASH160: 169, + OP_HASH256: 170, + OP_CODESEPARATOR: 171, + OP_CHECKSIG: 172, + OP_CHECKSIGVERIFY: 173, + OP_CHECKMULTISIG: 174, + OP_CHECKMULTISIGVERIFY: 175, + OP_NOP1: 176, + OP_NOP2: 177, + OP_CHECKLOCKTIMEVERIFY: 177, + OP_NOP3: 178, + OP_CHECKSEQUENCEVERIFY: 178, + OP_NOP4: 179, + OP_NOP5: 180, + OP_NOP6: 181, + OP_NOP7: 182, + OP_NOP8: 183, + OP_NOP9: 184, + OP_NOP10: 185, + OP_CHECKDATASIG: 186, + OP_CHECKDATASIGVERIFY: 187, + OP_REVERSEBYTES: 188, + OP_PUBKEYHASH: 253, + OP_PUBKEY: 254, + OP_INVALIDOPCODE: 255 +} class Script { constructor () {