@bitgo/bitcoinjs-lib
Advanced tools
Comparing version 6.1.0-rc.3 to 6.1.0-rc.4
{ | ||
"name": "@bitgo/bitcoinjs-lib", | ||
"version": "6.1.0-rc.3", | ||
"version": "6.1.0-rc.4", | ||
"description": "Client-side Bitcoin JavaScript library", | ||
@@ -5,0 +5,0 @@ "main": "./src/index.js", |
@@ -28,3 +28,3 @@ 'use strict'; | ||
} | ||
static fromBuffer(buffer) { | ||
static fromBuffer(buffer, amountType = 'number') { | ||
if (buffer.length < 80) throw new Error('Buffer too small (< 80 bytes)'); | ||
@@ -44,2 +44,3 @@ const bufferReader = new bufferutils_1.BufferReader(buffer); | ||
true, | ||
amountType, | ||
); | ||
@@ -60,4 +61,4 @@ bufferReader.offset += tx.byteLength(); | ||
} | ||
static fromHex(hex) { | ||
return Block.fromBuffer(Buffer.from(hex, 'hex')); | ||
static fromHex(hex, amountType = 'number') { | ||
return Block.fromBuffer(Buffer.from(hex, 'hex'), amountType); | ||
} | ||
@@ -64,0 +65,0 @@ static calculateTarget(bits) { |
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
exports.BufferReader = exports.BufferWriter = exports.cloneBuffer = exports.reverseBuffer = exports.writeUInt64LE = exports.readUInt64LE = void 0; | ||
exports.BufferReader = exports.BufferWriter = exports.cloneBuffer = exports.reverseBuffer = exports.writeUInt64LE = exports.readUInt64LE = exports.readUInt64BigIntLE = void 0; | ||
const types = require('./types'); | ||
@@ -9,22 +9,30 @@ const typeforce = require('typeforce'); | ||
function verifuint(value, max) { | ||
if (typeof value !== 'number') | ||
throw new Error('cannot write a non-number as a number'); | ||
if (typeof value !== 'number' && typeof value !== 'bigint') | ||
throw new Error('value must be a number or bigint'); | ||
if (value < 0) | ||
throw new Error('specified a negative value for writing an unsigned value'); | ||
if (value > max) throw new Error('RangeError: value out of range'); | ||
if (Math.floor(value) !== value) | ||
if (typeof value === 'number' && Math.floor(value) !== value) | ||
// bigint is enforced int | ||
throw new Error('value has a fractional component'); | ||
} | ||
function readUInt64BigIntLE(buffer, offset) { | ||
return buffer.readBigUInt64LE(offset); | ||
} | ||
exports.readUInt64BigIntLE = readUInt64BigIntLE; | ||
function readUInt64LE(buffer, offset) { | ||
const a = buffer.readUInt32LE(offset); | ||
let b = buffer.readUInt32LE(offset + 4); | ||
b *= 0x100000000; | ||
verifuint(b + a, 0x001fffffffffffff); | ||
return b + a; | ||
const result = readUInt64BigIntLE(buffer, offset); | ||
verifuint(result, 0x001fffffffffffff); | ||
return Number(result); | ||
} | ||
exports.readUInt64LE = readUInt64LE; | ||
function writeUInt64LE(buffer, value, offset) { | ||
verifuint(value, 0x001fffffffffffff); | ||
buffer.writeInt32LE(value & -1, offset); | ||
buffer.writeUInt32LE(Math.floor(value / 0x100000000), offset + 4); | ||
if (typeof value === 'number') { | ||
verifuint(value, 0x001fffffffffffff); | ||
} else if (typeof value === 'bigint') { | ||
verifuint(value, BigInt('0xffffffffffffffff')); | ||
} else { | ||
throw new Error('value must be a number or bigint'); | ||
} | ||
buffer.writeBigUInt64LE(BigInt(value), offset); | ||
return offset + 8; | ||
@@ -131,2 +139,7 @@ } | ||
} | ||
readUInt64BigInt() { | ||
const result = readUInt64BigIntLE(this.buffer, this.offset); | ||
this.offset += 8; | ||
return result; | ||
} | ||
readVarInt() { | ||
@@ -133,0 +146,0 @@ const vi = varuint.decode(this.buffer, this.offset); |
@@ -317,8 +317,15 @@ 'use strict'; | ||
// not all inputs will have .value defined | ||
const incoming = this.__INPUTS.reduce((a, x) => a + (x.value >>> 0), 0); | ||
const incoming = this.__INPUTS.reduce( | ||
(a, x) => | ||
a + (typeof x.value !== 'undefined' ? BigInt(x.value) : BigInt(0)), | ||
BigInt(0), | ||
); | ||
// but all outputs do, and if we have any input value | ||
// we can immediately determine if the outputs are too small | ||
const outgoing = this.__TX.outs.reduce((a, x) => a + x.value, 0); | ||
const outgoing = this.__TX.outs.reduce( | ||
(a, x) => a + BigInt(x.value), | ||
BigInt(0), | ||
); | ||
const fee = incoming - outgoing; | ||
const feeRate = fee / bytes; | ||
const feeRate = Number(fee) / bytes; // assume fee fits within number | ||
return feeRate > this.maximumFeeRate; | ||
@@ -325,0 +332,0 @@ } |
@@ -50,3 +50,3 @@ 'use strict'; | ||
} | ||
static fromBuffer(buffer, _NO_STRICT) { | ||
static fromBuffer(buffer, _NO_STRICT, amountType = 'number') { | ||
const bufferReader = new bufferutils_1.BufferReader(buffer); | ||
@@ -79,3 +79,6 @@ const tx = new Transaction(); | ||
tx.outs.push({ | ||
value: bufferReader.readUInt64(), | ||
value: | ||
amountType === 'number' | ||
? bufferReader.readUInt64() | ||
: bufferReader.readUInt64BigInt(), | ||
script: bufferReader.readVarSlice(), | ||
@@ -98,4 +101,4 @@ }); | ||
} | ||
static fromHex(hex) { | ||
return Transaction.fromBuffer(Buffer.from(hex, 'hex'), false); | ||
static fromHex(hex, amountType = 'number') { | ||
return Transaction.fromBuffer(Buffer.from(hex, 'hex'), false, amountType); | ||
} | ||
@@ -102,0 +105,0 @@ static isCoinbaseHash(buffer) { |
@@ -26,4 +26,8 @@ 'use strict'; | ||
const SATOSHI_MAX = 21 * 1e14; | ||
const BIG_SATOSHI_MAX = BigInt('1000000000000000000'); | ||
function Satoshi(value) { | ||
return typeforce.UInt53(value) && value <= SATOSHI_MAX; | ||
return ( | ||
(typeforce.UInt53(value) && value <= SATOSHI_MAX) || | ||
(typeof value === 'bigint' && value >= 0 && value <= BIG_SATOSHI_MAX) | ||
); | ||
} | ||
@@ -30,0 +34,0 @@ exports.Satoshi = Satoshi; |
/// <reference types="node" /> | ||
import { Transaction } from './transaction'; | ||
export declare class Block { | ||
static fromBuffer(buffer: Buffer): Block; | ||
static fromHex(hex: string): Block; | ||
export declare class Block<TNumber extends number | bigint = number> { | ||
static fromBuffer<TNumber extends number | bigint = number>(buffer: Buffer, amountType?: 'number' | 'bigint'): Block<TNumber>; | ||
static fromHex<TNumber extends number | bigint = number>(hex: string, amountType?: 'number' | 'bigint'): Block<TNumber>; | ||
static calculateTarget(bits: number): Buffer; | ||
static calculateMerkleRoot(transactions: Transaction[], forWitness?: boolean): Buffer; | ||
static calculateMerkleRoot<TNumber extends number | bigint = number>(transactions: Array<Transaction<TNumber>>, forWitness?: boolean): Buffer; | ||
version: number; | ||
@@ -15,3 +15,3 @@ prevHash?: Buffer; | ||
nonce: number; | ||
transactions?: Transaction[]; | ||
transactions?: Array<Transaction<TNumber>>; | ||
getWitnessCommit(): Buffer | null; | ||
@@ -18,0 +18,0 @@ hasWitnessCommit(): boolean; |
/// <reference types="node" /> | ||
export declare function readUInt64BigIntLE(buffer: Buffer, offset: number): bigint; | ||
export declare function readUInt64LE(buffer: Buffer, offset: number): number; | ||
export declare function writeUInt64LE(buffer: Buffer, value: number, offset: number): number; | ||
export declare function writeUInt64LE(buffer: Buffer, value: number | bigint, offset: number): number; | ||
export declare function reverseBuffer(buffer: Buffer): Buffer; | ||
@@ -17,3 +18,3 @@ export declare function cloneBuffer(buffer: Buffer): Buffer; | ||
writeUInt32(i: number): void; | ||
writeUInt64(i: number): void; | ||
writeUInt64(i: number | bigint): void; | ||
writeVarInt(i: number): void; | ||
@@ -36,2 +37,3 @@ writeSlice(slice: Buffer): void; | ||
readUInt64(): number; | ||
readUInt64BigInt(): bigint; | ||
readVarInt(): number; | ||
@@ -38,0 +40,0 @@ readSlice(n: number): Buffer; |
@@ -5,3 +5,3 @@ /// <reference types="node" /> | ||
import { Transaction } from './transaction'; | ||
interface TxbSignArg { | ||
interface TxbSignArg<TNumber extends number | bigint = number> { | ||
prevOutScriptType: string; | ||
@@ -12,3 +12,3 @@ vin: number; | ||
hashType?: number; | ||
witnessValue?: number; | ||
witnessValue?: TNumber; | ||
witnessScript?: Buffer; | ||
@@ -18,6 +18,6 @@ controlBlock?: Buffer; | ||
} | ||
export declare class TransactionBuilder { | ||
export declare class TransactionBuilder<TNumber extends number | bigint = number> { | ||
network: Network; | ||
maximumFeeRate: number; | ||
static fromTransaction(transaction: Transaction, network?: Network): TransactionBuilder; | ||
static fromTransaction<TNumber extends number | bigint = number>(transaction: Transaction<TNumber>, network?: Network): TransactionBuilder<TNumber>; | ||
private __PREV_TX_SET; | ||
@@ -31,7 +31,7 @@ private __INPUTS; | ||
setVersion(version: number): void; | ||
addInput(txHash: Buffer | string | Transaction, vout: number, sequence?: number, prevOutScript?: Buffer, value?: number): number; | ||
addOutput(scriptPubKey: string | Buffer, value: number): number; | ||
build(): Transaction; | ||
buildIncomplete(): Transaction; | ||
sign(signParams: number | TxbSignArg, keyPair?: Signer, redeemScript?: Buffer, hashType?: number, witnessValue?: number, witnessScript?: Buffer, controlBlock?: Buffer, annex?: Buffer): void; | ||
addInput(txHash: Buffer | string | Transaction<TNumber>, vout: number, sequence?: number, prevOutScript?: Buffer, value?: TNumber): number; | ||
addOutput(scriptPubKey: string | Buffer, value: TNumber): number; | ||
build(): Transaction<TNumber>; | ||
buildIncomplete(): Transaction<TNumber>; | ||
sign(signParams: number | TxbSignArg<TNumber>, keyPair?: Signer, redeemScript?: Buffer, hashType?: number, witnessValue?: TNumber, witnessScript?: Buffer, controlBlock?: Buffer, annex?: Buffer): void; | ||
private __addInputUnsafe; | ||
@@ -38,0 +38,0 @@ private __build; |
/// <reference types="node" /> | ||
export interface Output { | ||
export interface Output<TNumber extends number | bigint = number> { | ||
script: Buffer; | ||
value: number; | ||
value: TNumber; | ||
} | ||
@@ -13,3 +13,3 @@ export interface Input { | ||
} | ||
export declare class Transaction { | ||
export declare class Transaction<TNumber extends number | bigint = number> { | ||
static readonly DEFAULT_SEQUENCE = 4294967295; | ||
@@ -25,4 +25,4 @@ static readonly SIGHASH_DEFAULT = 0; | ||
static readonly ADVANCED_TRANSACTION_FLAG = 1; | ||
static fromBuffer(buffer: Buffer, _NO_STRICT?: boolean): Transaction; | ||
static fromHex(hex: string): Transaction; | ||
static fromBuffer<TNumber extends number | bigint = number>(buffer: Buffer, _NO_STRICT?: boolean, amountType?: 'number' | 'bigint'): Transaction<TNumber>; | ||
static fromHex<TNumber extends number | bigint = number>(hex: string, amountType?: 'number' | 'bigint'): Transaction<TNumber>; | ||
static isCoinbaseHash(buffer: Buffer): boolean; | ||
@@ -32,6 +32,6 @@ version: number; | ||
ins: Input[]; | ||
outs: Output[]; | ||
outs: Array<Output<TNumber>>; | ||
isCoinbase(): boolean; | ||
addInput(hash: Buffer, index: number, sequence?: number, scriptSig?: Buffer): number; | ||
addOutput(scriptPubKey: Buffer, value: number): number; | ||
addOutput(scriptPubKey: Buffer, value: TNumber): number; | ||
hasWitnesses(): boolean; | ||
@@ -41,3 +41,3 @@ weight(): number; | ||
byteLength(_ALLOW_WITNESS?: boolean): number; | ||
clone(): Transaction; | ||
clone(): Transaction<TNumber>; | ||
/** | ||
@@ -52,4 +52,4 @@ * Hash transaction for signing a specific input. | ||
hashForSignature(inIndex: number, prevOutScript: Buffer, hashType: number): Buffer; | ||
hashForWitnessV1(inIndex: number, prevOutScripts: Buffer[], values: number[], hashType: number, leafHash?: Buffer, annex?: Buffer): Buffer; | ||
hashForWitnessV0(inIndex: number, prevOutScript: Buffer, value: number, hashType: number): Buffer; | ||
hashForWitnessV1(inIndex: number, prevOutScripts: Buffer[], values: TNumber[], hashType: number, leafHash?: Buffer, annex?: Buffer): Buffer; | ||
hashForWitnessV0(inIndex: number, prevOutScript: Buffer, value: TNumber, hashType: number): Buffer; | ||
getHash(forWitness?: boolean): Buffer; | ||
@@ -56,0 +56,0 @@ getId(): string; |
@@ -7,3 +7,3 @@ export declare function UInt31(value: number): boolean; | ||
export declare function Signer(obj: any): boolean; | ||
export declare function Satoshi(value: number): boolean; | ||
export declare function Satoshi(value: number | bigint): boolean; | ||
export declare const ECPoint: any; | ||
@@ -10,0 +10,0 @@ export declare const Network: any; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
303451
8019