var bigi = require('bigi') var ecurve = require('ecurve') var typeforce = require('typeforce') function nBuffer (value, n) { typeforce(types.Buffer, value) if (value.length !== n) throw new Error('Expected ' + (n * 8) + '-bit Buffer, got ' + (value.length * 8) + '-bit Buffer') return true } function Hash160bit (value) { return nBuffer(value, 20) } function Hash256bit (value) { return nBuffer(value, 32) } function Buffer256bit (value) { return nBuffer(value, 32) } var UINT53_MAX = Math.pow(2, 53) - 1 function UInt2 (value) { return (value & 3) === value } function UInt8 (value) { return (value & 0xff) === value } function UInt32 (value) { return (value >>> 0) === value } function UInt53 (value) { return typeforce.Number(value) && value >= 0 && value <= UINT53_MAX && Math.floor(value) === value } // external dependent types function BigInt (value) { return !typeforce.Null(value) && value.constructor === bigi } function ECCurve (value) { return !typeforce.Null(value) && value.constructor === ecurve.Curve } function ECPoint (value) { return !typeforce.Null(value) && value.constructor === ecurve.Point } // exposed, external API var ECSignature = typeforce.compile({ r: BigInt, s: BigInt }) var Network = typeforce.compile({ messagePrefix: typeforce.oneOf(typeforce.Buffer, typeforce.String), bip32: { public: UInt32, private: UInt32 }, pubKeyHash: UInt8, scriptHash: UInt8, wif: UInt8, dustThreshold: UInt53 }) // extend typeforce types with ours var types = { BigInt: BigInt, Buffer256bit: Buffer256bit, ECCurve: ECCurve, ECPoint: ECPoint, ECSignature: ECSignature, Hash160bit: Hash160bit, Hash256bit: Hash256bit, Network: Network, UInt2: UInt2, UInt8: UInt8, UInt32: UInt32, UInt53: UInt53 } for (var typeName in typeforce) { types[typeName] = typeforce[typeName] } module.exports = types