blockfrost-js-ratelimited
Version:
A JavaScript/TypeScript SDK for interacting with the https://blockfrost.io API
52 lines (51 loc) • 2.38 kB
JavaScript
;
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;