UNPKG

navio-blsct

Version:

TypeScript bindings for the `libblsct` library used by the [Navio](https://nav.io/) blockchain to construct confidential transactions based on the BLS12-381 curve.

772 lines (692 loc) 19.9 kB
import assert from 'node:assert' const blsct = require('../build/Release/blsct.node') if (!blsct._initialized) { blsct.init() blsct._initialized = true } export const CTX_ID_SIZE = blsct.CTX_ID_SIZE export const POINT_SIZE = blsct.POINT_SIZE export const SCRIPT_SIZE = blsct.SCRIPT_SIZE export const BLSCT_IN_AMOUNT_ERROR = blsct.BLSCT_IN_AMOUNT_ERROR export const BLSCT_OUT_AMOUNT_ERROR = blsct.BLSCT_OUT_AMOUNT_ERROR export enum BlsctChain { Mainnet = 0, Testnet = 1, Signet = 2, Regtest = 3, } export enum TxOutputType { Normal, StakedCommitment, } export interface BlsctRetVal { value: any value_size: number result: number } export interface BlsctAmountsRetVal{ result: number value: any } export interface BlsctBoolRetVal { value: boolean, result: number } export interface BlsctCTxRetVal { result: number ctx: any in_amount_err_index: number out_amount_err_index: number } // address export const decodeAddress = (addrStr: string): BlsctRetVal => { return blsct.decode_address(addrStr) } export const encodeAddress = ( dpk: any, encoding: number ): BlsctRetVal => { return blsct.encode_address(dpk, encoding) } export const Bech32 = blsct.Bech32 export const Bech32M = blsct.Bech32M // chain export const getChain = (): BlsctChain => { return blsct.get_blsct_chain() } export const setChain = (chain: BlsctChain): void => { blsct.set_blsct_chain(chain) } // child key export const fromSeedToChildKey = (seed: any): any => { return blsct.from_seed_to_child_key(seed) } export const fromChildKeyToBlindingKey = (childKey: any): any => { return blsct.from_child_key_to_blinding_key(childKey) } export const fromChildKeyToTokenKey = (childKey: any): any => { return blsct.from_child_key_to_token_key(childKey) } export const fromChildKeyToTxKey = (childKey: any): any => { return blsct.from_child_key_to_tx_key(childKey) } // ctx export const addToTxInVec = (vec: any, txIn: any): void => { return blsct.add_to_tx_in_vec(vec, txIn) } export const addToTxOutVec = (vec: any, txOut: any): void => { return blsct.add_to_tx_out_vec(vec, txOut) } export const buildCTx = (txIns: any, txOuts: any): BlsctCTxRetVal => { return blsct.build_ctx(txIns, txOuts) } export const createTxInVec = (): any => { return blsct.create_tx_in_vec() } export const createTxOutVec = (): any => { return blsct.create_tx_out_vec() } export const deleteTxInVec = (txInVec: any): any => { return blsct.delete_tx_in_vec(txInVec) } export const deleteTxOutVec = (txOutVec: any): any => { return blsct.delete_tx_out_vec(txOutVec) } export const deleteCTx = (ctx: any): void => { return blsct.delete_ctx(ctx) } export const getCTxId = (ctx: any): string => { return blsct.get_ctx_id(ctx) } export const getCTxIns = (ctx: any): any => { return blsct.get_ctx_ins(ctx) } export const getCTxInAt = (ctxIns: any, i: number): any => { return blsct.get_ctx_in_at(ctxIns, i) } export const getCTxInsSize = (ctxIns: any): number => { return blsct.get_ctx_ins_size(ctxIns) } export const getCTxOuts = (ctx: any): any => { return blsct.get_ctx_outs(ctx) } export const getCTxOutAt = (ctxOuts: any, i: number): any => { return blsct.get_ctx_out_at(ctxOuts, i) } export const getCTxOutsSize = (ctxOuts: any): number => { return blsct.get_ctx_outs_size(ctxOuts) } // ctx id export const serializeCTxId = (ctxId: any): string => { return blsct.serialize_ctx_id(ctxId) } // ctx in export const getCTxInPrevOutHash = (obj: any): any => { return blsct.get_ctx_in_prev_out_hash(obj) } export const getCTxInPrevOutN = (obj: any): number => { return blsct.get_ctx_in_prev_out_n(obj) } export const getCTxInScriptSig = (obj: any): any => { return blsct.get_ctx_in_script_sig(obj) } export const getCTxInSequence = (obj: any): number => { return blsct.get_ctx_in_sequence(obj) } export const getCTxInScriptWitness = (obj: any): any => { return blsct.get_ctx_in_script_witness(obj) } // ctx out export const getCTxOutValue = (obj: any): number => { return blsct.get_ctx_out_value(obj) } export const getCTxOutScriptPubkey = (obj: any): any => { return blsct.get_ctx_out_script_pub_key(obj) } export const getCTxOutTokenId = (obj: any): any => { return blsct.get_ctx_out_token_id(obj) } export const getCTxOutVectorPredicate = (obj: any): BlsctRetVal => { return blsct.get_ctx_out_vector_predicate(obj) } // ctx out blsct data export const getCTxOutBlindingKey = (obj: any): any => { return blsct.get_ctx_out_blinding_key(obj) } export const getCTxOutEphemeralKey = (obj: any): any => { return blsct.get_ctx_out_ephemeral_key(obj) } export const getCTxOutSpendingKey = (obj: any): any => { return blsct.get_ctx_out_spending_key(obj) } export const getCTxOutRangeProof = (obj: any): BlsctRetVal => { return blsct.get_ctx_out_range_proof(obj) } export const getCTxOutViewTag = (obj: any): number => { return blsct.get_ctx_out_view_tag(obj) } // double public key export const deserializeDpk = (hex: string): BlsctRetVal => { return blsct.deserialize_dpk(hex) } export const genDoublePubKey = (pk1: any, pk2: any): BlsctRetVal => { return blsct.gen_double_pub_key(pk1, pk2) } export const genDpkWithKeysAcctAddr = ( viewKey: any, spendingPubKey: any, account: number, address: number ): any => { return blsct.gen_dpk_with_keys_acct_addr( viewKey, spendingPubKey, account, address ) } export const serializeDpk = (dpk: any): string => { return blsct.serialize_dpk(dpk) } // hash id export const calcKeyId = ( blindingPubKey: any, spendingPubKey: any, viewKey: any ): any => { return blsct.calc_key_id(blindingPubKey, spendingPubKey, viewKey) } export const deserializeKeyId = (hex: string): BlsctRetVal => { return blsct.deserialize_key_id(hex) } export const serializeKeyId = (hashId: any): string => { return blsct.serialize_key_id(hashId) } // misc export const freeObj = (obj: any): void => { if (obj !== null && obj !== undefined) { blsct.free_obj(obj) } } export const hexToMallocedBuf = (hex: string): any => { return blsct.hex_to_malloced_buf(hex) } export const runGc = async (): Promise<void> => { if (typeof global.gc === 'function') { ;(global as any).gc() await new Promise(r => setImmediate(r) ) } else { console.warn('Garbage collector is not exposed. Run Node.js with --expose-gc to expose it.') } } export const toHex = (buf: any, size: number): string => { return blsct.buf_to_malloced_hex_c_str(buf, size) } export const getValueAsCStr = (rv: BlsctRetVal): string => { return blsct.cast_to_const_char_ptr(rv.value) } // out point export const deserializeOutPoint = (hex: string): BlsctRetVal => { return blsct.deserialize_out_point(hex) } export const genOutPoint = (serCtxId: string, outIndex: number): any => { return blsct.gen_out_point(serCtxId, outIndex) } export const serializeOutPoint = (outPoint: any): string => { return blsct.serialize_out_point(outPoint) } // point export const deserializePoint = (hex: string): BlsctRetVal => { return blsct.deserialize_point(hex) } export const genBasePoint = (): BlsctRetVal => { return blsct.gen_base_point() } export const genRandomPoint = (): BlsctRetVal => { return blsct.gen_random_point() } export const arePointEqual = (a: any, b: any): boolean => { return blsct.are_point_equal(a, b) !== 0 } export const isValidPoint = (point: any): boolean => { return blsct.is_valid_point(point) !== 0 } export const pointFromScalar = (scalar: any): any => { return blsct.point_from_scalar(scalar) } export const pointToStr = (point: any): any => { return blsct.point_to_str(point) } export const serializePoint = (point: any): string => { return blsct.serialize_point(point) } // priv spending key export const calcPrivSpendingKey = ( blindingPubKey: any, viewKey: any, spendingKey: any, account: number, address: number): any => { return blsct.calc_priv_spending_key( blindingPubKey, viewKey, spendingKey, account, address ) } // public key export const calcNonce = (blindingPubKey: any, viewKey: any): any => { return blsct.calc_nonce(blindingPubKey, viewKey) } export const genRandomPublicKey = (): BlsctRetVal => { return blsct.gen_random_public_key() } export const getPublicKeyPoint = (obj: any): any => { return blsct.get_public_key_point(obj) } export const pointToPublicKey = (point: any): any => { return blsct.point_to_public_key(point) } export const scalarToPubKey = (scalar: any): any => { return blsct.scalar_to_pub_key(scalar) } // range proof export const addToRangeProofVec = ( rangeProofs: any, rangeProof: any, rangeProofSize: number, ): void => { blsct.add_to_range_proof_vec( rangeProofs, rangeProof, rangeProofSize, ) } export const addToAmountRecoveryReqVec = ( reqs: any[], req: any, ): void => { blsct.add_to_amount_recovery_req_vec(reqs, req) } export const addToUint64Vec = (vec: any, n: number): void => { blsct.add_to_uint64_vec(vec, n) } export const buildRangeProof = ( amounts: any, nonce: any, msg: any, token_id: any, ): BlsctRetVal => { return blsct.build_range_proof( amounts, nonce, msg, token_id, ) } export const createAmountRecoveryReqVec = (): any => { return blsct.create_amount_recovery_req_vec() } export const createRangeProofVec = (): any => { return blsct.create_range_proof_vec() } export const createUint64Vec = (): any => { return blsct.create_uint64_vec() } export const deserializeRangeProof = (hex: string): BlsctRetVal => { assert(hex.length % 2 === 0) const objSize = hex.length / 2 return blsct.deserialize_range_proof(hex, objSize) } export const deleteAmountRecoveryReqVec = (reqs: any): void => { blsct.delete_amount_recovery_req_vec(reqs) } export const deleteAmountsRetVal = (rv: BlsctAmountsRetVal): void => { blsct.free_amounts_ret_val(rv) } export const deleteRangeProofVec = (rangeProofs: any): void => { blsct.delete_range_proof_vec(rangeProofs) } export const deleteUint64Vec = (vec: any): any => { blsct.delete_uint64_vec(vec) } export const genAmountRecoveryReq = ( rangeProof: any, rangeProofSize: number, nonce: any, ): any => { return blsct.gen_amount_recovery_req( rangeProof, rangeProofSize, nonce, ) } export const getAmountRecoveryResultAmount = ( req: any, i: number, ): number => { return blsct.get_amount_recovery_result_amount(req, i) } export const getAmountRecoveryResultIsSucc = ( req: any, i: number, ): boolean => { return blsct.get_amount_recovery_result_is_succ(req, i) } export const getAmountRecoveryResultMsg = ( req: any, i: number, ): string => { return blsct.get_amount_recovery_result_msg(req, i) } export const getAmountRecoveryResultSize = ( resVec: any, ): number => { return blsct.get_amount_recovery_result_size(resVec) } export const getRangeProof_A = (rangeProof: any, rangeProofSize: number): any => { return blsct.get_range_proof_A(rangeProof, rangeProofSize) } export const getRangeProof_alpha_hat = (rangeProof: any, rangeProofSize: number): any => { return blsct.get_range_proof_alpha_hat(rangeProof, rangeProofSize) } export const getRangeProof_A_wip = (rangeProof: any, rangeProofSize: number): any => { return blsct.get_range_proof_A_wip(rangeProof, rangeProofSize) } export const getRangeProof_B = (rangeProof: any, rangeProofSize: number): any => { return blsct.get_range_proof_B(rangeProof, rangeProofSize) } export const getRangeProof_delta_prime = (rangeProof: any, rangeProofSize: number): any => { return blsct.get_range_proof_delta_prime(rangeProof, rangeProofSize) } export const getRangeProof_r_prime = (rangeProof: any, rangeProofSize: number): any => { return blsct.get_range_proof_r_prime(rangeProof, rangeProofSize) } export const getRangeProof_s_prime = (rangeProof: any, rangeProofSize: number): any => { return blsct.get_range_proof_s_prime(rangeProof, rangeProofSize) } export const getRangeProof_tau_x = (rangeProof: any, rangeProofSize: number): any => { return blsct.get_range_proof_tau_x(rangeProof, rangeProofSize) } export const recoverAmount = (vec: any): BlsctAmountsRetVal => { return blsct.recover_amount(vec) } export const serializeRangeProof = (rangeProof: any, rangeProofSize: number): string => { return blsct.serialize_range_proof(rangeProof, rangeProofSize) } export const verifyRangeProofs = (rangeProofs: any[]): BlsctBoolRetVal => { return blsct.verify_range_proofs(rangeProofs) } // scalar export const deserializeScalar = (hex: string): BlsctRetVal => { return blsct.deserialize_scalar(hex) } export const genRandomScalar = (): BlsctRetVal => { return blsct.gen_random_scalar() } export const genScalar = (value: number): BlsctRetVal => { return blsct.gen_scalar(value) } export const areScalarEqual = (a: any, b: any): boolean => { return blsct.are_scalar_equal(a, b) !== 0 } export const scalarToUint64 = (scalar: any): number => { return blsct.scalar_to_uint64(scalar) } export const serializeScalar = (scalar: any): string => { return blsct.serialize_scalar(scalar) } // script export const deserializeScript = (hex: string): any => { return blsct.deserialize_script(hex) } export const serializeScript = (script: any): string => { return blsct.serialize_script(script) } // signature export const deserializeSignature = (hex: string): any => { return blsct.deserialize_signature(hex) } export const serializeSignature = (script: any): string => { return blsct.serialize_signature(script) } export const signMessage = ( privKey: any, msg: string, ): any => { return blsct.sign_message(privKey, msg) } export const verifyMsgSig = ( pubKey: any, msg: string, signature: any, ): boolean => { return blsct.verify_msg_sig(pubKey, msg, signature) } // sub addr export const deriveSubAddress = ( viewKey: any, spendingPubKey: any, subAddrId: any, ): any => { return blsct.derive_sub_address( viewKey, spendingPubKey, subAddrId, ) } export const subAddrToDpk = (subAddr: any): any => { return blsct.sub_addr_to_dpk(subAddr) } export const deserializeSubAddr = (hex: string): any => { return blsct.deserialize_sub_addr(hex) } export const dpkToSubAddr = (dpk: any): BlsctRetVal => { return blsct.dpk_to_sub_addr(dpk) } export const serializeSubAddr = (subAddrId: any): string => { return blsct.serialize_sub_addr(subAddrId) } // sub addr id export const deserializeSubAddrId = (hex: string): any => { return blsct.deserialize_sub_addr_id(hex) } export const genSubAddrId = ( account: number, address: number, ): any => { return blsct.gen_sub_addr_id(account, address) } export const serializeSubAddrId = (subAddrId: any): string => { return blsct.serialize_sub_addr_id(subAddrId) } // token id export const deserializeTokenId = (hex: string): BlsctRetVal => { return blsct.deserialize_token_id(hex) } export const genTokenId = (token: number): BlsctRetVal => { return blsct.gen_token_id(token) } export const genTokenIdWithSubid = (token: number, subid: number): BlsctRetVal => { return blsct.gen_token_id_with_token_and_subid(token, subid) } export const genDefaultTokenId = (): BlsctRetVal => { return blsct.gen_default_token_id() } export const getTokenIdSubid = (tokenId: any): number => { return blsct.get_token_id_subid(tokenId) } export const getTokenIdToken = (tokenId: any): number => { return blsct.get_token_id_token(tokenId) } export const serializeTokenId = (tokenId: any): string => { return blsct.serialize_token_id(tokenId) } // tx key export const fromTxKeyToSpendingKey = (txKey: any): any => { return blsct.from_tx_key_to_spending_key(txKey) } export const fromTxKeyToViewKey = (txKey: any): any => { return blsct.from_tx_key_to_view_key(txKey) } // tx in export const buildTxIn = ( amount: number, gamma: number, spendingKey: any, tokenId: any, outPoint: any, isStakedCommitment: boolean, isRbf: boolean, ): any => { return blsct.build_tx_in( amount, gamma, spendingKey, tokenId, outPoint, isStakedCommitment, isRbf, ) } export const getTxInAmount = (obj: any): number => { return blsct.get_tx_in_amount(obj) } export const getTxInGamma = (obj: any): number => { return blsct.get_tx_in_gamma(obj) } export const getTxInSpendingKey = (obj: any): any => { return blsct.get_tx_in_spending_key(obj) } export const getTxInTokenId = (obj: any): any => { return blsct.get_tx_in_token_id(obj) } export const getTxInOutPoint = (obj: any): any => { return blsct.get_tx_in_out_point(obj) } export const getTxInStakedCommitment = (obj: any): boolean => { return blsct.get_tx_in_staked_commitment(obj) } export const getTxInRbf = (obj: any): boolean => { return blsct.get_tx_in_rbf(obj) } // tx out export const buildTxOut = ( subAddr: any, amount: number, memo: string, tokenId: any, outputType: TxOutputType, minStake: number, ): any => { let blsctOutputType switch (outputType) { case TxOutputType.Normal: blsctOutputType = blsct.Normal break case TxOutputType.StakedCommitment: blsctOutputType = blsct.StakedCommitment break default: throw new Error(`Unknown output type: ${outputType}`) } return blsct.build_tx_out( subAddr, amount, memo, tokenId, blsctOutputType, minStake, ) } export const getTxOutDestination = (obj: any): any => { return blsct.get_tx_out_destination(obj) } export const getTxOutAmount = (obj: any): number => { return blsct.get_tx_out_amount(obj) } export const getTxOutMemo = (obj: any): string => { return blsct.get_tx_out_memo(obj) } export const getTxOutTokenId = (obj: any): any => { return blsct.get_tx_out_token_id(obj) } export const getTxOutOutputType = (obj: any): TxOutputType => { const x = blsct.get_tx_out_output_type(obj) switch(x) { case blsct.Normal: return TxOutputType.Normal case blsct.StakedCommitment: return TxOutputType.StakedCommitment default: throw new Error(`Unknown TxOutputType ${x}`) } } export const getTxOutMinStake = (obj: any): number => { return blsct.get_tx_out_min_stake(obj) } // typecast export const asString = (obj: string): any => { return blsct.cast_to_const_char_ptr(obj) } export const castToCTxIn = (obj: any): any => { return blsct.cast_to_ctx_in(obj) } export const castToCTxOut = (obj: any): any => { return blsct.cast_to_ctx_out(obj) } export const castToDpk = (obj: any): any => { return blsct.cast_to_dpk(obj) } export const castToKeyId = (obj: any): any => { return blsct.cast_to_key_id(obj) } export const castToOutPoint = (obj: any): any => { return blsct.cast_to_out_point(obj) } export const castToPoint = (obj: any): any => { return blsct.cast_to_point(obj) } export const castToPubKey = (obj: any): any => { return blsct.cast_to_pub_key(obj) } export const castToRangeProof = (obj: any): any => { return blsct.cast_to_range_proof(obj) } export const castToScalar = (obj: any): any => { return blsct.cast_to_scalar(obj) } export const castToScript = (obj: any): any => { return blsct.cast_to_script(obj) } export const castToSignature = (obj: any): any => { return blsct.cast_to_signature(obj) } export const castToSubAddr = (obj: any): any => { return blsct.cast_to_sub_addr(obj) } export const castToSubAddrId = (obj: any): any => { return blsct.cast_to_sub_addr_id(obj) } export const castToTokenId = (obj: any): any => { return blsct.cast_to_token_id(obj) } export const castToTxIn = (obj: any): any => { return blsct.cast_to_tx_in(obj) } export const castToTxOut = (obj: any): any => { return blsct.cast_to_tx_out(obj) } export const castToUint8_tPtr = (obj: any): any => { return blsct.cast_to_uint8_t_ptr(obj) } // view tag export const calcViewTag = ( blindingPubKey: any, viewKey: any ): any => { return blsct.calc_view_tag(blindingPubKey, viewKey) }