New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@secux/app-btc

Package Overview
Dependencies
Maintainers
0
Versions
37
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.14 to 3.3.0

7

lib/app-btc.d.ts

@@ -142,2 +142,9 @@ /*!

static validateAddress(address: string, coin?: CoinType): boolean;
/**
* Get script type of address.
* @param {string} address
* @param {CoinType} [coin] default: CoinType.BITCOIN
* @returns {ScriptType} script type of address
*/
static getScriptType(address: string, coin?: CoinType): ScriptType;
}

@@ -144,0 +151,0 @@ /**

2

lib/app-btc.js

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

limitations under the License.
*/Object.defineProperty(exports,"__esModule",{value:!0}),exports.SecuxBTC=exports.ScriptType=exports.CoinType=void 0;const secp256k1=require("secp256k1/elliptic"),varuint=require("varuint-bitcoin"),utility_1=require("@secux/utility"),xpub_1=require("@secux/utility/lib/xpub"),ow_1=require("ow"),protocol_transaction_1=require("@secux/protocol-transaction"),communication_1=require("@secux/utility/lib/communication"),BIP32Path_1=require("@secux/utility/lib/BIP32Path"),interface_1=require("@secux/protocol-transaction/lib/interface"),interface_2=require("./interface");Object.defineProperty(exports,"CoinType",{enumerable:!0,get:function(){return interface_2.CoinType}}),Object.defineProperty(exports,"ScriptType",{enumerable:!0,get:function(){return interface_2.ScriptType}});const psbt_1=require("./psbt"),utils_1=require("./utils"),payment_1=require("./payment"),payment_bch_1=require("./payment_bch"),payment_grs_1=require("./payment_grs");class SecuxBTC{static addressConvert(publickey,path){const pk=(0,utils_1.getPublickey)(publickey);(0,ow_1.default)(path,ow_1.default.any(interface_2.ow_path,interface_2.ow_PathObject));const compressed=Buffer.from(secp256k1.publicKeyConvert(pk,!0)),coin="string"==typeof path?(0,utils_1.getCoinType)(path):path.coin,script="string"==typeof path?(0,utils_1.getDefaultScript)(path):path.script,payment=(0,utils_1.getPayment)(coin);switch(script){case interface_2.ScriptType.P2SH_P2WPKH:const p2wpkh=payment.p2wpkh(coin,{publickey:compressed});return payment.p2sh(coin,p2wpkh.redeemHash).address;case interface_2.ScriptType.P2SH_P2PKH:const p2pkh=payment.p2pkh(coin,{publickey:compressed});return payment.p2sh(coin,p2pkh.redeemHash).address;case interface_2.ScriptType.P2PKH:return payment.p2pkh(coin,{publickey:compressed}).address;case interface_2.ScriptType.P2WPKH:return payment.p2wpkh(coin,{publickey:compressed}).address;case interface_2.ScriptType.P2TR:return payment.p2tr(coin,{publickey:compressed}).address;default:throw Error(`Invalid or unsupported ScriptType, got ${script} of ${coin}`)}}static prepareAddress(path,option){return this.preparePublickey(path,option)}static resolveAddress(response,path){const pk=SecuxBTC.resolvePublickey(response);return SecuxBTC.addressConvert(pk,path)}static preparePublickey(path,option){var _a;(0,ow_1.default)(path,interface_2.ow_path),option&&(0,ow_1.default)(option,interface_2.ow_AddressOption);const coin=null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:(0,utils_1.getCoinType)(path),cointype=interface_2.coinmap[coin].coinType,purpose=void 0===(null==option?void 0:option.script)?void 0:(0,utils_1.getPurpose)(null==option?void 0:option.script);return(0,ow_1.default)(path,(0,utility_1.ow_strictPath)(cointype,purpose)),protocol_transaction_1.SecuxTransactionTool.getPublickey(path,interface_1.EllipticCurve.SECP256K1)}static resolvePublickey(response){const pk=protocol_transaction_1.SecuxTransactionTool.resolvePublickey(response,interface_1.EllipticCurve.SECP256K1,!0);return Buffer.from(pk,"base64").toString("hex")}static prepareXPublickey(path){return(0,ow_1.default)(path,interface_2.ow_accountPath),protocol_transaction_1.SecuxTransactionTool.getXPublickey(path)}static resolveXPublickey(response,path){return(0,ow_1.default)(path,interface_2.ow_accountPath),protocol_transaction_1.SecuxTransactionTool.resolveXPublickey(response,path)}static prepareSign(inputs,outputs,option){var _a;(0,ow_1.default)(inputs,ow_1.default.array.ofType(interface_2.ow_txInput).minLength(1)),(0,ow_1.default)(option,ow_1.default.any(ow_1.default.undefined,interface_2.ow_SignOption));const coin=null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:(0,utils_1.getCoinType)(inputs[0].path);(0,ow_1.default)(outputs,interface_2.ow_txOutput);const setPublickey=data=>{const xpub=null==option?void 0:option.xpub;if(!xpub)return;if(data.publickey)return;const bip32=(0,BIP32Path_1.splitPath)(data.path);data.publickey=SecuxBTC.derivePublicKey(xpub,bip32.change.value,bip32.addressIndex.value)};inputs.forEach((input=>{const purpose=input.script?(0,utils_1.getPurpose)(input.script):interface_2.btcPurposes;(0,ow_1.default)(input.path,(0,utility_1.ow_strictPath)(interface_2.coinmap[coin].coinType,purpose)),setPublickey(input)}));let _=(0,interface_2.isOutuptScriptExtended)(outputs.to);if(_){const purpose=_.script?(0,utils_1.getPurpose)(_.script):interface_2.btcPurposes;(0,ow_1.default)(_.path,(0,utility_1.ow_strictPath)(interface_2.coinmap[coin].coinType,purpose)),setPublickey(outputs.to)}if(outputs.utxo){const purpose=outputs.utxo.script?(0,utils_1.getPurpose)(outputs.utxo.script):interface_2.btcPurposes;(0,ow_1.default)(outputs.utxo.path,(0,utility_1.ow_strictPath)(interface_2.coinmap[coin].coinType,purpose)),setPublickey(outputs.utxo)}const psbt=new psbt_1.SecuxPsbt(coin,null==option?void 0:option.isRBF);return psbt.AddInputs(inputs),psbt.AddOutputs(outputs.utxo?[outputs.to,outputs.utxo]:[outputs.to]),(0,communication_1.wrapResult)(psbt.PrepareSign(null==option?void 0:option.feeRate))}static resolveSignatureList(response){return protocol_transaction_1.SecuxTransactionTool.resolveSignatureList(response).map((x=>Buffer.from(x,"base64"))).map((x=>utility_1.Signature.fromSignature(x))).map((x=>Buffer.concat([x.r,x.s]).toString("hex")))}static resolveTransaction(response,params){var _a;(0,ow_1.default)(response,ow_1.default.any(communication_1.ow_communicationData,ow_1.default.array.ofType(communication_1.ow_communicationData))),(0,ow_1.default)(params,interface_2.ow_TransactionObject),response=Array.isArray(response)?response:[response];const signatures=[];for(const rsp of response){const sigList=SecuxBTC.resolveSignatureList(rsp).map((x=>Buffer.from(x,"hex")));signatures.push(...sigList)}const pks=params.publickeys.map((x=>(0,utils_1.getPublickey)(x)));return psbt_1.SecuxPsbt.FromBuffer(Buffer.from(params.rawTx,"hex"),null!==(_a=params.coin)&&void 0!==_a?_a:interface_2.CoinType.BITCOIN).appendSignature(signatures,pks).finalizeAllInputs().extractTransaction().toHex()}static async getAddress(path,option){var _a,_b;const data=SecuxBTC.prepareAddress(path,option),rsp=await this.Exchange((0,communication_1.getBuffer)(data));return SecuxBTC.resolveAddress(rsp,{coin:null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:(0,utils_1.getCoinType)(path),script:null!==(_b=null==option?void 0:option.script)&&void 0!==_b?_b:(0,utils_1.getDefaultScript)(path)})}static async getPublickey(path,option){const data=SecuxBTC.preparePublickey(path,option),rsp=await this.Exchange((0,communication_1.getBuffer)(data));return SecuxBTC.resolvePublickey(rsp)}static async getXPublickey(path){const data=SecuxBTC.prepareXPublickey(path),rsp=await this.Exchange((0,communication_1.getBuffer)(data));return SecuxBTC.resolveXPublickey(rsp,path)}static async sign(inputs,outputs,option){var _a,_b;const cache={},getPK=async path=>{if(void 0!==cache[path])return cache[path];const publickey=await SecuxBTC.getPublickey.call(this,path,{coin}),pk=Buffer.from(publickey,"hex");return cache[path]=pk,pk},coin=null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:(0,utils_1.getCoinType)(inputs[0].path);if(!(null==option?void 0:option.xpub)){for(const txIn of inputs)void 0===txIn.publickey&&(txIn.publickey=await getPK(txIn.path));outputs.to.path&&void 0===outputs.to.publickey&&(outputs.to.publickey=await getPK(outputs.to.path)),(null===(_b=outputs.utxo)||void 0===_b?void 0:_b.path)&&void 0===outputs.utxo.publickey&&(outputs.utxo.publickey=await getPK(outputs.utxo.path))}const{commands,rawTx}=SecuxBTC.prepareSign(inputs,outputs,Object.assign(Object.assign({},option),{coin}));return{multi_command:commands,rawTx,publickeys:inputs.map((x=>x.publickey)),coin}}static derivePublicKey(xpub,change,addressIndex){(0,ow_1.default)(change,ow_1.default.number.uint32),(0,ow_1.default)(addressIndex,ow_1.default.number.uint32);const _xpub="string"==typeof xpub?(0,xpub_1.decodeXPUB)(xpub):xpub;if(3!==_xpub.depth)throw Error(`ArgumentError: expect depth from xpub is 3, but got ${_xpub.depth}`);const{publickey}=(0,xpub_1.deriveKey)(_xpub.publickey,_xpub.chaincode,[change,addressIndex]);return(0,communication_1.toCommunicationData)(publickey)}static deriveAddress(xpub,change,addressIndex,option){var _a,_b;(0,ow_1.default)(option,ow_1.default.any(ow_1.default.undefined,interface_2.ow_AddressOption));const _xpub=(0,xpub_1.decodeXPUB)(xpub);if(null==option?void 0:option.script)if([interface_2.ScriptType.P2PKH,interface_2.ScriptType.P2SH_P2PKH,interface_2.ScriptType.P2SH_P2WPKH,interface_2.ScriptType.P2WPKH].includes(option.script)){const purpose=(0,utils_1.getPurpose)(null==option?void 0:option.script);if(_xpub.purpose!==purpose)throw Error(`ArgumentError: expect purpose from xpub is ${purpose}, but got ${_xpub.purpose}`)}else if(44!==_xpub.purpose)throw Error(`ArgumentError: expect purpose from xpub is 44, but got ${_xpub.purpose}`);const publickey=SecuxBTC.derivePublicKey(_xpub,change,addressIndex),coin=null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:interface_2.CoinType.BITCOIN,script=null!==(_b=null==option?void 0:option.script)&&void 0!==_b?_b:(0,utils_1.getDefaultScript)(`m/${_xpub.purpose}'`);return SecuxBTC.addressConvert((0,communication_1.getBuffer)(publickey),{coin,script})}static getVirtualSize(inputs,outputs){const baseSize=8+varuint.encodingLength(inputs.length)+varuint.encodingLength(outputs.length)+inputs.reduce(((sum,input)=>sum+40+(0,utils_1.sliceSize)((0,utils_1.getInScriptSize)(input))),0)+outputs.reduce(((sum,output)=>sum+8+(0,utils_1.sliceSize)((0,utils_1.getOutScriptSize)(output))),0),inputsWitness=inputs.map((x=>(0,utils_1.getWitnessSize)(x)));return(4*baseSize+(inputsWitness.some((x=>0!==x.length))?2+inputsWitness.reduce(((sum,w)=>sum+(0,utils_1.vectorSize)(w)),0):0))/4}static getDustThreshold(output,dustRelayFee=3){return(0,utils_1.getDustThreshold)(output,dustRelayFee)}static validateAddress(address,coin=interface_2.CoinType.BITCOIN){try{switch(coin){case interface_2.CoinType.BITCOINCASH:payment_bch_1.PaymentBCH.decode(coin,address);break;case interface_2.CoinType.GROESTL:payment_grs_1.PaymentGRS.decode(coin,address);break;default:payment_1.PaymentBTC.decode(coin,address)}}catch(error){return!1}return!0}}exports.SecuxBTC=SecuxBTC,(0,utility_1.loadPlugin)(SecuxBTC,"SecuxBTC");
*/Object.defineProperty(exports,"__esModule",{value:!0}),exports.SecuxBTC=exports.ScriptType=exports.CoinType=void 0;const secp256k1=require("secp256k1/elliptic"),varuint=require("varuint-bitcoin"),utility_1=require("@secux/utility"),xpub_1=require("@secux/utility/lib/xpub"),ow_1=require("ow"),protocol_transaction_1=require("@secux/protocol-transaction"),communication_1=require("@secux/utility/lib/communication"),BIP32Path_1=require("@secux/utility/lib/BIP32Path"),interface_1=require("@secux/protocol-transaction/lib/interface"),interface_2=require("./interface");Object.defineProperty(exports,"CoinType",{enumerable:!0,get:function(){return interface_2.CoinType}}),Object.defineProperty(exports,"ScriptType",{enumerable:!0,get:function(){return interface_2.ScriptType}});const psbt_1=require("./psbt"),utils_1=require("./utils"),payment_1=require("./payment"),payment_bch_1=require("./payment_bch"),payment_grs_1=require("./payment_grs");class SecuxBTC{static addressConvert(publickey,path){const pk=(0,utils_1.getPublickey)(publickey);(0,ow_1.default)(path,ow_1.default.any(interface_2.ow_path,interface_2.ow_PathObject));const compressed=Buffer.from(secp256k1.publicKeyConvert(pk,!0)),coin="string"==typeof path?(0,utils_1.getCoinType)(path):path.coin,script="string"==typeof path?(0,utils_1.getDefaultScript)(path):path.script,payment=(0,utils_1.getPayment)(coin);switch(script){case interface_2.ScriptType.P2SH_P2WPKH:const p2wpkh=payment.p2wpkh(coin,{publickey:compressed});return payment.p2sh(coin,p2wpkh.redeemHash).address;case interface_2.ScriptType.P2SH_P2PKH:const p2pkh=payment.p2pkh(coin,{publickey:compressed});return payment.p2sh(coin,p2pkh.redeemHash).address;case interface_2.ScriptType.P2PKH:return payment.p2pkh(coin,{publickey:compressed}).address;case interface_2.ScriptType.P2WPKH:return payment.p2wpkh(coin,{publickey:compressed}).address;case interface_2.ScriptType.P2TR:return payment.p2tr(coin,{publickey:compressed}).address;default:throw Error(`Invalid or unsupported ScriptType, got ${script} of ${coin}`)}}static prepareAddress(path,option){return this.preparePublickey(path,option)}static resolveAddress(response,path){const pk=SecuxBTC.resolvePublickey(response);return SecuxBTC.addressConvert(pk,path)}static preparePublickey(path,option){var _a;(0,ow_1.default)(path,interface_2.ow_path),option&&(0,ow_1.default)(option,interface_2.ow_AddressOption);const coin=null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:(0,utils_1.getCoinType)(path),cointype=interface_2.coinmap[coin].coinType,purpose=void 0===(null==option?void 0:option.script)?void 0:(0,utils_1.getPurpose)(null==option?void 0:option.script);return(0,ow_1.default)(path,(0,utility_1.ow_strictPath)(cointype,purpose)),protocol_transaction_1.SecuxTransactionTool.getPublickey(path,interface_1.EllipticCurve.SECP256K1)}static resolvePublickey(response){const pk=protocol_transaction_1.SecuxTransactionTool.resolvePublickey(response,interface_1.EllipticCurve.SECP256K1,!0);return Buffer.from(pk,"base64").toString("hex")}static prepareXPublickey(path){return(0,ow_1.default)(path,interface_2.ow_accountPath),protocol_transaction_1.SecuxTransactionTool.getXPublickey(path)}static resolveXPublickey(response,path){return(0,ow_1.default)(path,interface_2.ow_accountPath),protocol_transaction_1.SecuxTransactionTool.resolveXPublickey(response,path)}static prepareSign(inputs,outputs,option){var _a;(0,ow_1.default)(inputs,ow_1.default.array.ofType(interface_2.ow_txInput).minLength(1)),(0,ow_1.default)(option,ow_1.default.any(ow_1.default.undefined,interface_2.ow_SignOption));const coin=null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:(0,utils_1.getCoinType)(inputs[0].path);(0,ow_1.default)(outputs,interface_2.ow_txOutput);const setPublickey=data=>{const xpub=null==option?void 0:option.xpub;if(!xpub)return;if(data.publickey)return;const bip32=(0,BIP32Path_1.splitPath)(data.path);data.publickey=SecuxBTC.derivePublicKey(xpub,bip32.change.value,bip32.addressIndex.value)};inputs.forEach((input=>{const purpose=input.script?(0,utils_1.getPurpose)(input.script):interface_2.btcPurposes;(0,ow_1.default)(input.path,(0,utility_1.ow_strictPath)(interface_2.coinmap[coin].coinType,purpose)),setPublickey(input)}));let _=(0,interface_2.isOutuptScriptExtended)(outputs.to);if(_){const purpose=_.script?(0,utils_1.getPurpose)(_.script):interface_2.btcPurposes;(0,ow_1.default)(_.path,(0,utility_1.ow_strictPath)(interface_2.coinmap[coin].coinType,purpose)),setPublickey(outputs.to)}if(outputs.utxo){const purpose=outputs.utxo.script?(0,utils_1.getPurpose)(outputs.utxo.script):interface_2.btcPurposes;(0,ow_1.default)(outputs.utxo.path,(0,utility_1.ow_strictPath)(interface_2.coinmap[coin].coinType,purpose)),setPublickey(outputs.utxo)}const psbt=new psbt_1.SecuxPsbt(coin,null==option?void 0:option.isRBF);return psbt.AddInputs(inputs),psbt.AddOutputs(outputs.utxo?[outputs.to,outputs.utxo]:[outputs.to]),(0,communication_1.wrapResult)(psbt.PrepareSign(null==option?void 0:option.feeRate))}static resolveSignatureList(response){return protocol_transaction_1.SecuxTransactionTool.resolveSignatureList(response).map((x=>Buffer.from(x,"base64"))).map((x=>utility_1.Signature.fromSignature(x))).map((x=>Buffer.concat([x.r,x.s]).toString("hex")))}static resolveTransaction(response,params){var _a;(0,ow_1.default)(response,ow_1.default.any(communication_1.ow_communicationData,ow_1.default.array.ofType(communication_1.ow_communicationData))),(0,ow_1.default)(params,interface_2.ow_TransactionObject),response=Array.isArray(response)?response:[response];const signatures=[];for(const rsp of response){const sigList=SecuxBTC.resolveSignatureList(rsp).map((x=>Buffer.from(x,"hex")));signatures.push(...sigList)}const pks=params.publickeys.map((x=>(0,utils_1.getPublickey)(x)));return psbt_1.SecuxPsbt.FromBuffer(Buffer.from(params.rawTx,"hex"),null!==(_a=params.coin)&&void 0!==_a?_a:interface_2.CoinType.BITCOIN).appendSignature(signatures,pks).finalizeAllInputs().extractTransaction().toHex()}static async getAddress(path,option){var _a,_b;const data=SecuxBTC.prepareAddress(path,option),rsp=await this.Exchange((0,communication_1.getBuffer)(data));return SecuxBTC.resolveAddress(rsp,{coin:null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:(0,utils_1.getCoinType)(path),script:null!==(_b=null==option?void 0:option.script)&&void 0!==_b?_b:(0,utils_1.getDefaultScript)(path)})}static async getPublickey(path,option){const data=SecuxBTC.preparePublickey(path,option),rsp=await this.Exchange((0,communication_1.getBuffer)(data));return SecuxBTC.resolvePublickey(rsp)}static async getXPublickey(path){const data=SecuxBTC.prepareXPublickey(path),rsp=await this.Exchange((0,communication_1.getBuffer)(data));return SecuxBTC.resolveXPublickey(rsp,path)}static async sign(inputs,outputs,option){var _a,_b;const cache={},getPK=async path=>{if(void 0!==cache[path])return cache[path];const publickey=await SecuxBTC.getPublickey.call(this,path,{coin}),pk=Buffer.from(publickey,"hex");return cache[path]=pk,pk},coin=null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:(0,utils_1.getCoinType)(inputs[0].path);if(!(null==option?void 0:option.xpub)){for(const txIn of inputs)void 0===txIn.publickey&&(txIn.publickey=await getPK(txIn.path));outputs.to.path&&void 0===outputs.to.publickey&&(outputs.to.publickey=await getPK(outputs.to.path)),(null===(_b=outputs.utxo)||void 0===_b?void 0:_b.path)&&void 0===outputs.utxo.publickey&&(outputs.utxo.publickey=await getPK(outputs.utxo.path))}const{commands,rawTx}=SecuxBTC.prepareSign(inputs,outputs,Object.assign(Object.assign({},option),{coin}));return{multi_command:commands,rawTx,publickeys:inputs.map((x=>x.publickey)),coin}}static derivePublicKey(xpub,change,addressIndex){(0,ow_1.default)(change,ow_1.default.number.uint32),(0,ow_1.default)(addressIndex,ow_1.default.number.uint32);const _xpub="string"==typeof xpub?(0,xpub_1.decodeXPUB)(xpub):xpub;if(3!==_xpub.depth)throw Error(`ArgumentError: expect depth from xpub is 3, but got ${_xpub.depth}`);const{publickey}=(0,xpub_1.deriveKey)(_xpub.publickey,_xpub.chaincode,[change,addressIndex]);return(0,communication_1.toCommunicationData)(publickey)}static deriveAddress(xpub,change,addressIndex,option){var _a,_b;(0,ow_1.default)(option,ow_1.default.any(ow_1.default.undefined,interface_2.ow_AddressOption));const _xpub=(0,xpub_1.decodeXPUB)(xpub);if(null==option?void 0:option.script)if([interface_2.ScriptType.P2PKH,interface_2.ScriptType.P2SH_P2PKH,interface_2.ScriptType.P2SH_P2WPKH,interface_2.ScriptType.P2WPKH].includes(option.script)){const purpose=(0,utils_1.getPurpose)(null==option?void 0:option.script);if(_xpub.purpose!==purpose)throw Error(`ArgumentError: expect purpose from xpub is ${purpose}, but got ${_xpub.purpose}`)}else if(44!==_xpub.purpose)throw Error(`ArgumentError: expect purpose from xpub is 44, but got ${_xpub.purpose}`);const publickey=SecuxBTC.derivePublicKey(_xpub,change,addressIndex),coin=null!==(_a=null==option?void 0:option.coin)&&void 0!==_a?_a:interface_2.CoinType.BITCOIN,script=null!==(_b=null==option?void 0:option.script)&&void 0!==_b?_b:(0,utils_1.getDefaultScript)(`m/${_xpub.purpose}'`);return SecuxBTC.addressConvert((0,communication_1.getBuffer)(publickey),{coin,script})}static getVirtualSize(inputs,outputs){const baseSize=8+varuint.encodingLength(inputs.length)+varuint.encodingLength(outputs.length)+inputs.reduce(((sum,input)=>sum+40+(0,utils_1.sliceSize)((0,utils_1.getInScriptSize)(input))),0)+outputs.reduce(((sum,output)=>sum+8+(0,utils_1.sliceSize)((0,utils_1.getOutScriptSize)(output))),0),inputsWitness=inputs.map((x=>(0,utils_1.getWitnessSize)(x)));return(4*baseSize+(inputsWitness.some((x=>0!==x.length))?2+inputsWitness.reduce(((sum,w)=>sum+(0,utils_1.vectorSize)(w)),0):0))/4}static getDustThreshold(output,dustRelayFee=3){return(0,utils_1.getDustThreshold)(output,dustRelayFee)}static validateAddress(address,coin=interface_2.CoinType.BITCOIN){try{switch(coin){case interface_2.CoinType.BITCOINCASH:payment_bch_1.PaymentBCH.decode(coin,address);break;case interface_2.CoinType.GROESTL:payment_grs_1.PaymentGRS.decode(coin,address);break;default:payment_1.PaymentBTC.decode(coin,address)}}catch(error){return!1}return!0}static getScriptType(address,coin=interface_2.CoinType.BITCOIN){try{switch(coin){case interface_2.CoinType.BITCOINCASH:{const script=payment_bch_1.PaymentBCH.decode(coin,address);return payment_bch_1.PaymentBCH.classify(script)}case interface_2.CoinType.GROESTL:{const script=payment_grs_1.PaymentGRS.decode(coin,address);return payment_grs_1.PaymentGRS.classify(script)}default:{const script=payment_1.PaymentBTC.decode(coin,address);return payment_1.PaymentBTC.classify(script)}}}catch(error){throw Error("unknown script type")}}}exports.SecuxBTC=SecuxBTC,(0,utility_1.loadPlugin)(SecuxBTC,"SecuxBTC");

@@ -23,7 +23,8 @@ /*!

P2WPKH = 1,
P2SH_P2PKH = 2,
P2SH_P2WPKH = 3,
P2TR = 4,
P2WSH = 5,
__LENGTH = 6
P2SH = 2,
P2SH_P2PKH = 3,
P2SH_P2WPKH = 4,
P2TR = 5,
P2WSH = 6,
__LENGTH = 7
}

@@ -30,0 +31,0 @@ export declare enum CoinType {

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

limitations under the License.
*/Object.defineProperty(exports,"__esModule",{value:!0}),exports.ow_SignOption=exports.ow_AddressOption=exports.ow_TransactionObject=exports.isOutuptScriptExtended=exports.isOutuptScript=exports.isOutputAddress=exports.ow_txOutput=exports.ow_txOutputScriptExtened=exports.ow_txOutputScript=exports.ow_txOutputAddress=exports.ow_txInput=exports.ow_PathObject=exports.ow_hashString=exports.ow_hexString=exports.ow_accountPath=exports.ow_path=exports.ow_balance=exports.btcPurposes=exports.btcCoinTypes=exports.coinmap=exports.CoinType=exports.ScriptType=exports.OPCODES=void 0;const ow_1=require("ow"),constants=require("./coindef"),utils=require("@secux/utility");var ScriptType,CoinType,coindef_1=require("./coindef");Object.defineProperty(exports,"OPCODES",{enumerable:!0,get:function(){return coindef_1.OPCODES}}),function(ScriptType){ScriptType[ScriptType.P2PKH=0]="P2PKH",ScriptType[ScriptType.P2WPKH=1]="P2WPKH",ScriptType[ScriptType.P2SH_P2PKH=2]="P2SH_P2PKH",ScriptType[ScriptType.P2SH_P2WPKH=3]="P2SH_P2WPKH",ScriptType[ScriptType.P2TR=4]="P2TR",ScriptType[ScriptType.P2WSH=5]="P2WSH",ScriptType[ScriptType.__LENGTH=6]="__LENGTH"}(ScriptType=exports.ScriptType||(exports.ScriptType={})),function(CoinType){CoinType[CoinType.BITCOIN=0]="BITCOIN",CoinType[CoinType.TESTNET=1]="TESTNET",CoinType[CoinType.REGTEST=2]="REGTEST",CoinType[CoinType.LITECOIN=3]="LITECOIN",CoinType[CoinType.BITCOINCASH=4]="BITCOINCASH",CoinType[CoinType.GROESTL=5]="GROESTL",CoinType[CoinType.DIGIBYTE=6]="DIGIBYTE",CoinType[CoinType.DASH=7]="DASH",CoinType[CoinType.DOGECOIN=8]="DOGECOIN",CoinType[CoinType.__LENGTH=9]="__LENGTH"}(CoinType=exports.CoinType||(exports.CoinType={})),exports.coinmap=Object.freeze(Object.values(CoinType).slice(0,CoinType.__LENGTH).map((x=>constants[x.toLowerCase()]))),exports.btcCoinTypes=Object.freeze(exports.coinmap.map((x=>Object.freeze(x.coinType)))),exports.btcPurposes=Object.freeze([Object.freeze(44),Object.freeze(49),Object.freeze(84),Object.freeze(86)]),exports.ow_balance=ow_1.default.any(ow_1.default.number.integer.positive,utils.owTool.numberString),exports.ow_path=utils.ow_strictPath(exports.btcCoinTypes,exports.btcPurposes),exports.ow_accountPath=utils.ow_accountPath(exports.btcCoinTypes,exports.btcPurposes),exports.ow_hexString=utils.owTool.hexString,exports.ow_hashString=utils.owTool.hashString,exports.ow_PathObject=ow_1.default.object.exactShape({coin:ow_1.default.number.inRange(0,CoinType.__LENGTH-1),script:ow_1.default.number.inRange(0,ScriptType.__LENGTH-1)}),exports.ow_txInput=ow_1.default.object.exactShape({hash:exports.ow_hashString,vout:ow_1.default.number.greaterThanOrEqual(0),txHex:ow_1.default.any(ow_1.default.undefined,exports.ow_hexString),script:ow_1.default.optional.number.inRange(0,ScriptType.__LENGTH-1),satoshis:exports.ow_balance,path:exports.ow_path,publickey:ow_1.default.any(ow_1.default.undefined,exports.ow_hexString,ow_1.default.buffer)}),exports.ow_txOutputAddress=ow_1.default.object.exactShape({address:exports.ow_hashString,satoshis:exports.ow_balance}),exports.ow_txOutputScript=ow_1.default.object.exactShape({scriptHex:exports.ow_hexString,satoshis:exports.ow_balance}),exports.ow_txOutputScriptExtened=ow_1.default.object.exactShape({publickey:ow_1.default.any(ow_1.default.undefined,exports.ow_hexString,ow_1.default.buffer),path:exports.ow_path,satoshis:exports.ow_balance,script:ow_1.default.optional.number.inRange(0,ScriptType.__LENGTH-1)}),exports.ow_txOutput=ow_1.default.object.exactShape({to:ow_1.default.any(exports.ow_txOutputAddress,exports.ow_txOutputScriptExtened),utxo:ow_1.default.any(ow_1.default.undefined,exports.ow_txOutputScriptExtened)}),exports.isOutputAddress=function(output){const out=output;if(out.address)return out},exports.isOutuptScript=function(output){const out=output;if(out.scriptHex)return out},exports.isOutuptScriptExtended=function(output){try{return(0,ow_1.default)(output,exports.ow_txOutputScriptExtened),output}catch(error){}},exports.ow_TransactionObject=ow_1.default.object.partialShape({rawTx:exports.ow_hexString,publickeys:ow_1.default.array.ofType(ow_1.default.any(exports.ow_hexString,ow_1.default.buffer)),coin:ow_1.default.optional.number.inRange(0,CoinType.__LENGTH-1)}),exports.ow_AddressOption=ow_1.default.object.exactShape({coin:ow_1.default.optional.number.inRange(0,CoinType.__LENGTH-1),script:ow_1.default.optional.number.inRange(0,ScriptType.__LENGTH-1)}),exports.ow_SignOption=ow_1.default.object.partialShape({coin:ow_1.default.optional.number.inRange(0,CoinType.__LENGTH-1),feeRate:ow_1.default.optional.number.greaterThanOrEqual(1),isRBF:ow_1.default.optional.boolean});
*/Object.defineProperty(exports,"__esModule",{value:!0}),exports.ow_SignOption=exports.ow_AddressOption=exports.ow_TransactionObject=exports.isOutuptScriptExtended=exports.isOutuptScript=exports.isOutputAddress=exports.ow_txOutput=exports.ow_txOutputScriptExtened=exports.ow_txOutputScript=exports.ow_txOutputAddress=exports.ow_txInput=exports.ow_PathObject=exports.ow_hashString=exports.ow_hexString=exports.ow_accountPath=exports.ow_path=exports.ow_balance=exports.btcPurposes=exports.btcCoinTypes=exports.coinmap=exports.CoinType=exports.ScriptType=exports.OPCODES=void 0;const ow_1=require("ow"),constants=require("./coindef"),utils=require("@secux/utility");var ScriptType,CoinType,coindef_1=require("./coindef");Object.defineProperty(exports,"OPCODES",{enumerable:!0,get:function(){return coindef_1.OPCODES}}),function(ScriptType){ScriptType[ScriptType.P2PKH=0]="P2PKH",ScriptType[ScriptType.P2WPKH=1]="P2WPKH",ScriptType[ScriptType.P2SH=2]="P2SH",ScriptType[ScriptType.P2SH_P2PKH=3]="P2SH_P2PKH",ScriptType[ScriptType.P2SH_P2WPKH=4]="P2SH_P2WPKH",ScriptType[ScriptType.P2TR=5]="P2TR",ScriptType[ScriptType.P2WSH=6]="P2WSH",ScriptType[ScriptType.__LENGTH=7]="__LENGTH"}(ScriptType=exports.ScriptType||(exports.ScriptType={})),function(CoinType){CoinType[CoinType.BITCOIN=0]="BITCOIN",CoinType[CoinType.TESTNET=1]="TESTNET",CoinType[CoinType.REGTEST=2]="REGTEST",CoinType[CoinType.LITECOIN=3]="LITECOIN",CoinType[CoinType.BITCOINCASH=4]="BITCOINCASH",CoinType[CoinType.GROESTL=5]="GROESTL",CoinType[CoinType.DIGIBYTE=6]="DIGIBYTE",CoinType[CoinType.DASH=7]="DASH",CoinType[CoinType.DOGECOIN=8]="DOGECOIN",CoinType[CoinType.__LENGTH=9]="__LENGTH"}(CoinType=exports.CoinType||(exports.CoinType={})),exports.coinmap=Object.freeze(Object.values(CoinType).slice(0,CoinType.__LENGTH).map((x=>constants[x.toLowerCase()]))),exports.btcCoinTypes=Object.freeze(exports.coinmap.map((x=>Object.freeze(x.coinType)))),exports.btcPurposes=Object.freeze([Object.freeze(44),Object.freeze(49),Object.freeze(84),Object.freeze(86)]),exports.ow_balance=ow_1.default.any(ow_1.default.number.integer.positive,utils.owTool.numberString),exports.ow_path=utils.ow_strictPath(exports.btcCoinTypes,exports.btcPurposes),exports.ow_accountPath=utils.ow_accountPath(exports.btcCoinTypes,exports.btcPurposes),exports.ow_hexString=utils.owTool.hexString,exports.ow_hashString=utils.owTool.hashString,exports.ow_PathObject=ow_1.default.object.exactShape({coin:ow_1.default.number.inRange(0,CoinType.__LENGTH-1),script:ow_1.default.number.inRange(0,ScriptType.__LENGTH-1)}),exports.ow_txInput=ow_1.default.object.exactShape({hash:exports.ow_hashString,vout:ow_1.default.number.greaterThanOrEqual(0),txHex:ow_1.default.any(ow_1.default.undefined,exports.ow_hexString),script:ow_1.default.optional.number.inRange(0,ScriptType.__LENGTH-1),satoshis:exports.ow_balance,path:exports.ow_path,publickey:ow_1.default.any(ow_1.default.undefined,exports.ow_hexString,ow_1.default.buffer)}),exports.ow_txOutputAddress=ow_1.default.object.exactShape({address:exports.ow_hashString,satoshis:exports.ow_balance}),exports.ow_txOutputScript=ow_1.default.object.exactShape({scriptHex:exports.ow_hexString,satoshis:exports.ow_balance}),exports.ow_txOutputScriptExtened=ow_1.default.object.exactShape({publickey:ow_1.default.any(ow_1.default.undefined,exports.ow_hexString,ow_1.default.buffer),path:exports.ow_path,satoshis:exports.ow_balance,script:ow_1.default.optional.number.inRange(0,ScriptType.__LENGTH-1)}),exports.ow_txOutput=ow_1.default.object.exactShape({to:ow_1.default.any(exports.ow_txOutputAddress,exports.ow_txOutputScriptExtened),utxo:ow_1.default.any(ow_1.default.undefined,exports.ow_txOutputScriptExtened)}),exports.isOutputAddress=function(output){const out=output;if(out.address)return out},exports.isOutuptScript=function(output){const out=output;if(out.scriptHex)return out},exports.isOutuptScriptExtended=function(output){try{return(0,ow_1.default)(output,exports.ow_txOutputScriptExtened),output}catch(error){}},exports.ow_TransactionObject=ow_1.default.object.partialShape({rawTx:exports.ow_hexString,publickeys:ow_1.default.array.ofType(ow_1.default.any(exports.ow_hexString,ow_1.default.buffer)),coin:ow_1.default.optional.number.inRange(0,CoinType.__LENGTH-1)}),exports.ow_AddressOption=ow_1.default.object.exactShape({coin:ow_1.default.optional.number.inRange(0,CoinType.__LENGTH-1),script:ow_1.default.optional.number.inRange(0,ScriptType.__LENGTH-1)}),exports.ow_SignOption=ow_1.default.object.partialShape({coin:ow_1.default.optional.number.inRange(0,CoinType.__LENGTH-1),feeRate:ow_1.default.optional.number.greaterThanOrEqual(1),isRBF:ow_1.default.optional.boolean});

@@ -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 p2wsh(coin,opt){if(this.CoinSupported(coin),!opt.witness&&!opt.hash)throw Error("Invalid Parameters");const redeemHash=opt.hash?opt.hash:Sha256(opt.witness[opt.witness.length-1]);null===exports.logger||void 0===exports.logger||exports.logger.info(`redeem hash: ${redeemHash.toString("hex")}`);let network=interface_1.coinmap[coin];const words=bech32_1.bech32.toWords(redeemHash);words.unshift(0);const address=bech32_1.bech32.encode(network.bech32,words),op=Buffer.from([interface_1.OPCODES.OP_0,32]);return{address,scriptPublickey:Buffer.concat([op,redeemHash]),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));if(null===exports.logger||void 0===exports.logger||exports.logger.debug(`bech32 address: ${address}\nbech32 decoded: ${hash160.toString("hex")}`),20==hash160.length)return this.p2wpkh(coin,{hash:hash160}).scriptPublickey;if(32==hash160.length)return this.p2wsh(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;if(this.isP2WSH(script))return interface_1.ScriptType.P2WSH;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 isP2WSH(script){return 34===script.length&&script[0]===interface_1.OPCODES.OP_0&&32===script[1]}static isP2TR(script){return 34===script.length&&81===script[0]&&32===script[1]}}function Sha256(data){const sha=(0,hash_js_1.sha256)().update(data).digest();return Buffer.from(sha)}function Hash160(publickey){const sha=Sha256(publickey);return Buffer.from((0,hash_js_1.ripemd160)().update(sha).digest())}exports.PaymentBTC=PaymentBTC,PaymentBTC.bs58check=new bs58_1.bs58Check((function(data){const sha1=Sha256(data);return Sha256(sha1)})),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 p2wsh(coin,opt){if(this.CoinSupported(coin),!opt.witness&&!opt.hash)throw Error("Invalid Parameters");const redeemHash=opt.hash?opt.hash:Sha256(opt.witness[opt.witness.length-1]);null===exports.logger||void 0===exports.logger||exports.logger.info(`redeem hash: ${redeemHash.toString("hex")}`);let network=interface_1.coinmap[coin];const words=bech32_1.bech32.toWords(redeemHash);words.unshift(0);const address=bech32_1.bech32.encode(network.bech32,words),op=Buffer.from([interface_1.OPCODES.OP_0,32]);return{address,scriptPublickey:Buffer.concat([op,redeemHash]),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));if(null===exports.logger||void 0===exports.logger||exports.logger.debug(`bech32 address: ${address}\nbech32 decoded: ${hash160.toString("hex")}`),20==hash160.length)return this.p2wpkh(coin,{hash:hash160}).scriptPublickey;if(32==hash160.length)return this.p2wsh(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;if(this.isP2WSH(script))return interface_1.ScriptType.P2WSH;if(this.isP2SH(script))return interface_1.ScriptType.P2SH;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 isP2WSH(script){return 34===script.length&&script[0]===interface_1.OPCODES.OP_0&&32===script[1]}static isP2TR(script){return 34===script.length&&81===script[0]&&32===script[1]}}function Sha256(data){const sha=(0,hash_js_1.sha256)().update(data).digest();return Buffer.from(sha)}function Hash160(publickey){const sha=Sha256(publickey);return Buffer.from((0,hash_js_1.ripemd160)().update(sha).digest())}exports.PaymentBTC=PaymentBTC,PaymentBTC.bs58check=new bs58_1.bs58Check((function(data){const sha1=Sha256(data);return Sha256(sha1)})),exports.Hash160=Hash160;
{
"name": "@secux/app-btc",
"version": "3.2.14",
"version": "3.3.0",
"description": "SecuX Hardware Wallet BTC API",

@@ -5,0 +5,0 @@ "keywords": [

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