Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@secux/app-btc

Package Overview
Dependencies
Maintainers
1
Versions
35
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@secux/app-btc - npm Package Compare versions

Comparing version 3.2.7 to 3.2.8

2

lib/payment.js

@@ -18,2 +18,2 @@ "use strict";

limitations under the License.
*/Object.defineProperty(exports,"__esModule",{value:!0}),exports.logger=exports.Hash160=exports.CoinType=exports.PaymentBTC=void 0;const bech32_1=require("bech32"),hash_js_1=require("hash.js"),interface_1=require("./interface");Object.defineProperty(exports,"CoinType",{enumerable:!0,get:function(){return interface_1.CoinType}});const bs58_1=require("@secux/utility/lib/bs58"),utility_1=require("@secux/utility"),utils_1=require("./utils");exports.logger=null===utility_1.Logger||void 0===utility_1.Logger?void 0:utility_1.Logger.child({id:"payment"});class PaymentBTC{static CoinSupported(coin){if(coin===interface_1.CoinType.BITCOINCASH)throw Error("Please use class PaymentBCH instead");if(coin===interface_1.CoinType.GROESTL)throw Error("Please use class PaymentGRS instead")}static p2pkh(coin,opt){if(this.CoinSupported(coin),!opt.publickey&&!opt.hash)throw Error("Invalid Parameters");if(opt.publickey&&opt.hash)throw Error("Invalid Parameters");const pkHash=opt.hash?opt.hash:Hash160(opt.publickey);null===exports.logger||void 0===exports.logger||exports.logger.info(`publickey hash: ${pkHash.toString("hex")}`);const network=interface_1.coinmap[coin],address=this.bs58check.encode(pkHash,Buffer.from([network.pubKeyHash])),op=Buffer.from([interface_1.OPCODES.OP_DUP,interface_1.OPCODES.OP_HASH160,20]),check=Buffer.from([interface_1.OPCODES.OP_EQUALVERIFY,interface_1.OPCODES.OP_CHECKSIG]),scriptPublickey=Buffer.concat([op,pkHash,check]),redeemHash=Hash160(scriptPublickey);return null===exports.logger||void 0===exports.logger||exports.logger.info(`redeem hash: ${redeemHash.toString("hex")}`),{address,scriptPublickey,redeemHash}}static p2sh(coin,redeemHash){this.CoinSupported(coin);const network=interface_1.coinmap[coin],address=this.bs58check.encode(redeemHash,Buffer.from([network.scriptHash])),op=Buffer.from([interface_1.OPCODES.OP_HASH160,20]),check=Buffer.from([interface_1.OPCODES.OP_EQUAL]);return{address,scriptPublickey:Buffer.concat([op,redeemHash,check])}}static p2wpkh(coin,opt){if(this.CoinSupported(coin),!opt.publickey&&!opt.hash)throw Error("Invalid Parameters");if(opt.publickey&&opt.hash)throw Error("Invalid Parameters");const pkHash=opt.hash?opt.hash:Hash160(opt.publickey);null===exports.logger||void 0===exports.logger||exports.logger.info(`publickey hash: ${pkHash.toString("hex")}`);let network=interface_1.coinmap[coin];const words=bech32_1.bech32.toWords(pkHash);words.unshift(0);const address=bech32_1.bech32.encode(network.bech32,words),op=Buffer.from([interface_1.OPCODES.OP_0,20]),scriptPublickey=Buffer.concat([op,pkHash]),redeemHash=Hash160(scriptPublickey);return null===exports.logger||void 0===exports.logger||exports.logger.info(`redeem hash: ${redeemHash.toString("hex")}`),{address,scriptPublickey,redeemHash}}static p2ms(m,publickeys){if(m<=0)throw Error('Invalid paramter "m"');m+=interface_1.OPCODES.OP_INT_BASE;const n=publickeys.length+interface_1.OPCODES.OP_INT_BASE,multi_pk=Buffer.concat(publickeys),redeem=Buffer.concat([Buffer.from([m]),multi_pk,Buffer.from([n]),Buffer.from([interface_1.OPCODES.OP_CHECKMULTISIG])]),redeemHash=Hash160(redeem);null===exports.logger||void 0===exports.logger||exports.logger.info(`redeem hash: ${redeemHash.toString("hex")}`);const op=Buffer.from([interface_1.OPCODES.OP_HASH160,20]),check=Buffer.from([interface_1.OPCODES.OP_EQUAL]);return{redeem,scriptPubicKey:Buffer.concat([op,redeemHash,check])}}static p2tr(coin,opt){if(this.CoinSupported(coin),!opt.publickey&&!opt.hash)throw Error("Invalid Parameters");if(opt.publickey&&opt.hash)throw Error("Invalid Parameters");let tweaked=opt.hash;void 0===tweaked&&(tweaked=(0,utils_1.toTweakedPublickey)(opt.publickey));const network=interface_1.coinmap[coin],words=bech32_1.bech32.toWords(tweaked);words.unshift(1);const address=bech32_1.bech32m.encode(network.bech32,words),header=Buffer.from([81,32]);return{address,scriptPublickey:Buffer.concat([header,tweaked])}}static decode(coin,address){const network=interface_1.coinmap[coin];if(network.bech32&&address.startsWith(network.bech32)){let result;if("p"===address.slice(network.bech32.length+1)[0])result=bech32_1.bech32m.decode(address);else result=bech32_1.bech32.decode(address);const version=result.words.shift();switch(version){case 0:const hash160=Buffer.from(bech32_1.bech32.fromWords(result.words));return null===exports.logger||void 0===exports.logger||exports.logger.debug(`bech32 address: ${address}\nbech32 decoded: ${hash160.toString("hex")}`),this.p2wpkh(coin,{hash:hash160}).scriptPublickey;case 1:const tweaked=Buffer.from(bech32_1.bech32m.fromWords(result.words));return null===exports.logger||void 0===exports.logger||exports.logger.debug(`bech32m address: ${address}\nbech32m decoded: ${tweaked.toString("hex")}`),this.p2tr(coin,{hash:tweaked}).scriptPublickey;default:throw Error(`ArgumentError: unsupported witness version, got "${version}" from address "${address}"`)}}try{const hash160=this.bs58check.decode(address),prefix=hash160[0],hash=hash160.slice(1);if(prefix===network.scriptHash)return this.p2sh(coin,hash).scriptPublickey;if(prefix===network.pubKeyHash)return this.p2pkh(coin,{hash}).scriptPublickey}catch(error){null===exports.logger||void 0===exports.logger||exports.logger.debug(`${error.toString()}, cointype: ${interface_1.CoinType[coin]}, address: ${address}`)}throw Error(`ArgumentError: invalid address for ${interface_1.CoinType[coin]}, got ${address}`)}static classify(script){if(this.isP2WPKH(script))return interface_1.ScriptType.P2WPKH;if(this.isP2PKH(script))return interface_1.ScriptType.P2PKH;if(this.isP2TR(script))return interface_1.ScriptType.P2TR;throw Error(`non-standard script: ${script.toString("hex")}`)}static isP2PKH(script){return 25===script.length&&script[0]===interface_1.OPCODES.OP_DUP&&script[1]===interface_1.OPCODES.OP_HASH160&&20===script[2]&&script[23]===interface_1.OPCODES.OP_EQUALVERIFY&&script[24]===interface_1.OPCODES.OP_CHECKSIG}static isP2SH(script){return 23===script.length&&script[0]===interface_1.OPCODES.OP_HASH160&&20===script[1]&&script[22]===interface_1.OPCODES.OP_EQUAL}static isP2WPKH(script){return 22===script.length&&script[0]===interface_1.OPCODES.OP_0&&20===script[1]}static isP2TR(script){return 34===script.length&&81===script[0]&&32===script[1]}}function Hash160(publickey){const sha=Buffer.from((0,hash_js_1.sha256)().update(publickey).digest());return Buffer.from((0,hash_js_1.ripemd160)().update(sha).digest())}exports.PaymentBTC=PaymentBTC,PaymentBTC.bs58check=new bs58_1.bs58Check((function(data){const sha1=(0,hash_js_1.sha256)().update(data).digest(),sha2=(0,hash_js_1.sha256)().update(sha1).digest();return Buffer.from(sha2)})),exports.Hash160=Hash160;
*/Object.defineProperty(exports,"__esModule",{value:!0}),exports.logger=exports.Hash160=exports.CoinType=exports.PaymentBTC=void 0;const bech32_1=require("bech32"),hash_js_1=require("hash.js"),interface_1=require("./interface");Object.defineProperty(exports,"CoinType",{enumerable:!0,get:function(){return interface_1.CoinType}});const bs58_1=require("@secux/utility/lib/bs58"),utility_1=require("@secux/utility"),utils_1=require("./utils");exports.logger=null===utility_1.Logger||void 0===utility_1.Logger?void 0:utility_1.Logger.child({id:"payment"});class PaymentBTC{static CoinSupported(coin){if(coin===interface_1.CoinType.BITCOINCASH)throw Error("Please use class PaymentBCH instead");if(coin===interface_1.CoinType.GROESTL)throw Error("Please use class PaymentGRS instead")}static p2pkh(coin,opt){if(this.CoinSupported(coin),!opt.publickey&&!opt.hash)throw Error("Invalid Parameters");if(opt.publickey&&opt.hash)throw Error("Invalid Parameters");const pkHash=opt.hash?opt.hash:Hash160(opt.publickey);null===exports.logger||void 0===exports.logger||exports.logger.info(`publickey hash: ${pkHash.toString("hex")}`);const network=interface_1.coinmap[coin],address=this.bs58check.encode(pkHash,Buffer.from([network.pubKeyHash])),op=Buffer.from([interface_1.OPCODES.OP_DUP,interface_1.OPCODES.OP_HASH160,20]),check=Buffer.from([interface_1.OPCODES.OP_EQUALVERIFY,interface_1.OPCODES.OP_CHECKSIG]),scriptPublickey=Buffer.concat([op,pkHash,check]),redeemHash=Hash160(scriptPublickey);return null===exports.logger||void 0===exports.logger||exports.logger.info(`redeem hash: ${redeemHash.toString("hex")}`),{address,scriptPublickey,redeemHash}}static p2sh(coin,redeemHash){this.CoinSupported(coin);const network=interface_1.coinmap[coin],address=this.bs58check.encode(redeemHash,Buffer.from([network.scriptHash])),op=Buffer.from([interface_1.OPCODES.OP_HASH160,20]),check=Buffer.from([interface_1.OPCODES.OP_EQUAL]);return{address,scriptPublickey:Buffer.concat([op,redeemHash,check])}}static p2wpkh(coin,opt){if(this.CoinSupported(coin),!opt.publickey&&!opt.hash)throw Error("Invalid Parameters");if(opt.publickey&&opt.hash)throw Error("Invalid Parameters");const pkHash=opt.hash?opt.hash:Hash160(opt.publickey);null===exports.logger||void 0===exports.logger||exports.logger.info(`publickey hash: ${pkHash.toString("hex")}`);let network=interface_1.coinmap[coin];const words=bech32_1.bech32.toWords(pkHash);words.unshift(0);const address=bech32_1.bech32.encode(network.bech32,words),op=Buffer.from([interface_1.OPCODES.OP_0,20]),scriptPublickey=Buffer.concat([op,pkHash]),redeemHash=Hash160(scriptPublickey);return null===exports.logger||void 0===exports.logger||exports.logger.info(`redeem hash: ${redeemHash.toString("hex")}`),{address,scriptPublickey,redeemHash}}static p2ms(m,publickeys){if(m<=0)throw Error('Invalid paramter "m"');m+=interface_1.OPCODES.OP_INT_BASE;const n=publickeys.length+interface_1.OPCODES.OP_INT_BASE,multi_pk=Buffer.concat(publickeys),redeem=Buffer.concat([Buffer.from([m]),multi_pk,Buffer.from([n]),Buffer.from([interface_1.OPCODES.OP_CHECKMULTISIG])]),redeemHash=Hash160(redeem);null===exports.logger||void 0===exports.logger||exports.logger.info(`redeem hash: ${redeemHash.toString("hex")}`);const op=Buffer.from([interface_1.OPCODES.OP_HASH160,20]),check=Buffer.from([interface_1.OPCODES.OP_EQUAL]);return{redeem,scriptPubicKey:Buffer.concat([op,redeemHash,check])}}static p2tr(coin,opt){if(this.CoinSupported(coin),!opt.publickey&&!opt.hash)throw Error("Invalid Parameters");if(opt.publickey&&opt.hash)throw Error("Invalid Parameters");let tweaked=opt.hash;void 0===tweaked&&(tweaked=(0,utils_1.toTweakedPublickey)(opt.publickey));const network=interface_1.coinmap[coin],words=bech32_1.bech32.toWords(tweaked);words.unshift(1);const address=bech32_1.bech32m.encode(network.bech32,words),header=Buffer.from([81,32]);return{address,scriptPublickey:Buffer.concat([header,tweaked])}}static decode(coin,address){const network=interface_1.coinmap[coin];if(network.bech32&&RegExp(`^${network.bech32}`,"i").test(address)){let result;if("p"===address.slice(network.bech32.length+1)[0])result=bech32_1.bech32m.decode(address);else result=bech32_1.bech32.decode(address);const version=result.words.shift();switch(version){case 0:const hash160=Buffer.from(bech32_1.bech32.fromWords(result.words));return null===exports.logger||void 0===exports.logger||exports.logger.debug(`bech32 address: ${address}\nbech32 decoded: ${hash160.toString("hex")}`),this.p2wpkh(coin,{hash:hash160}).scriptPublickey;case 1:const tweaked=Buffer.from(bech32_1.bech32m.fromWords(result.words));return null===exports.logger||void 0===exports.logger||exports.logger.debug(`bech32m address: ${address}\nbech32m decoded: ${tweaked.toString("hex")}`),this.p2tr(coin,{hash:tweaked}).scriptPublickey;default:throw Error(`ArgumentError: unsupported witness version, got "${version}" from address "${address}"`)}}try{const hash160=this.bs58check.decode(address),prefix=hash160[0],hash=hash160.slice(1);if(prefix===network.scriptHash)return this.p2sh(coin,hash).scriptPublickey;if(prefix===network.pubKeyHash)return this.p2pkh(coin,{hash}).scriptPublickey}catch(error){null===exports.logger||void 0===exports.logger||exports.logger.debug(`${error.toString()}, cointype: ${interface_1.CoinType[coin]}, address: ${address}`)}throw Error(`ArgumentError: invalid address for ${interface_1.CoinType[coin]}, got ${address}`)}static classify(script){if(this.isP2WPKH(script))return interface_1.ScriptType.P2WPKH;if(this.isP2PKH(script))return interface_1.ScriptType.P2PKH;if(this.isP2TR(script))return interface_1.ScriptType.P2TR;throw Error(`non-standard script: ${script.toString("hex")}`)}static isP2PKH(script){return 25===script.length&&script[0]===interface_1.OPCODES.OP_DUP&&script[1]===interface_1.OPCODES.OP_HASH160&&20===script[2]&&script[23]===interface_1.OPCODES.OP_EQUALVERIFY&&script[24]===interface_1.OPCODES.OP_CHECKSIG}static isP2SH(script){return 23===script.length&&script[0]===interface_1.OPCODES.OP_HASH160&&20===script[1]&&script[22]===interface_1.OPCODES.OP_EQUAL}static isP2WPKH(script){return 22===script.length&&script[0]===interface_1.OPCODES.OP_0&&20===script[1]}static isP2TR(script){return 34===script.length&&81===script[0]&&32===script[1]}}function Hash160(publickey){const sha=Buffer.from((0,hash_js_1.sha256)().update(publickey).digest());return Buffer.from((0,hash_js_1.ripemd160)().update(sha).digest())}exports.PaymentBTC=PaymentBTC,PaymentBTC.bs58check=new bs58_1.bs58Check((function(data){const sha1=(0,hash_js_1.sha256)().update(data).digest(),sha2=(0,hash_js_1.sha256)().update(sha1).digest();return Buffer.from(sha2)})),exports.Hash160=Hash160;
{
"name": "@secux/app-btc",
"version": "3.2.7",
"version": "3.2.8",
"description": "SecuX Hardware Wallet BTC API",

@@ -45,2 +45,3 @@ "keywords": [

"bip66": "^1.1.5",
"bitcoin-address-validation": "^2.2.1",
"cashaddrjs": "^0.4.4",

@@ -47,0 +48,0 @@ "coinselect": "^3.1.13",

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc