UNPKG

blockfrost-js-ratelimited

Version:

A JavaScript/TypeScript SDK for interacting with the https://blockfrost.io API

52 lines (51 loc) 2.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getAccount = exports.deriveAddress = void 0; const cardano_serialization_lib_nodejs_1 = require("@emurgo/cardano-serialization-lib-nodejs"); const config_1 = require("../config"); const deriveAddress = (publicKey, addressIndex, type) => { const accountKey = cardano_serialization_lib_nodejs_1.Bip32PublicKey.from_bytes(Buffer.from(publicKey, 'hex')); const utxoPubKey = accountKey.derive(type).derive(addressIndex); const stakeKey = accountKey.derive(2).derive(0); const baseAddr = cardano_serialization_lib_nodejs_1.BaseAddress.new(cardano_serialization_lib_nodejs_1.NetworkInfo.mainnet().network_id(), cardano_serialization_lib_nodejs_1.StakeCredential.from_keyhash(utxoPubKey.to_raw_key().hash()), cardano_serialization_lib_nodejs_1.StakeCredential.from_keyhash(stakeKey.to_raw_key().hash())); return { address: baseAddr.to_address().to_bech32(), path: `m/1852'/1815'/0'/${type}/${addressIndex}`, }; }; exports.deriveAddress = deriveAddress; async function getAccount(publicKey, type) { let lastEmptyCount = 0; let addressCount = 0; const result = []; while (lastEmptyCount < config_1.ADDRESS_GAP_LIMIT) { const promisesBundle = []; for (let i = 0; i < config_1.ADDRESS_GAP_LIMIT; i++) { const { address, path } = exports.deriveAddress(publicKey, addressCount, type); addressCount++; const promise = this.addresses(address); promisesBundle.push({ address, promise, path }); } await Promise.all(promisesBundle.map(p => p.promise .then(data => { result.push({ address: p.address, path: p.path, data }); lastEmptyCount = 0; }) .catch(error => { lastEmptyCount++; if (error.status_code === 404) { result.push({ address: p.address, data: 'empty', path: p.path }); } else { throw Error(error); } }))); } const sortedResult = result.sort((item1, item2) => { const path1 = parseInt(item1.path.split('/').slice(-1)[0], 10); const path2 = parseInt(item2.path.split('/').slice(-1)[0], 10); return path1 - path2; }); return sortedResult; } exports.getAccount = getAccount;