myathhhh
Version:
Atomicals Javascript Library and CLI - atomicals.xyz
920 lines • 115 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const commander_1 = require("commander");
const _1 = require(".");
const dotenv = require("dotenv");
const electrum_api_1 = require("./api/electrum-api");
const validate_cli_inputs_1 = require("./utils/validate-cli-inputs");
const validate_wallet_storage_1 = require("./utils/validate-wallet-storage");
const qrcode = require("qrcode-terminal");
const address_helpers_1 = require("./utils/address-helpers");
const command_interface_1 = require("./commands/command.interface");
const file_utils_1 = require("./utils/file-utils");
const atomical_format_helpers_1 = require("./utils/atomical-format-helpers");
const quotes = require("success-motivational-quotes");
const chalk = require("chalk");
dotenv.config();
/////////////////////////////////////////////////////////////////////////////////////////////
// General Helper Functions
/////////////////////////////////////////////////////////////////////////////////////////////
function printSuccess(data, showDonation) {
console.log(JSON.stringify(data, null, 2));
if (!showDonation) {
return;
}
if (process.env.DISABLE_DONATE_QUOTE && process.env.DISABLE_DONATE_QUOTE === 'true') {
return;
}
console.log(chalk.blue("\n\n------------------------------------------------------------------------------"));
let q = 'Recommend to your children virtue; that alone can make them happy, not gold.';
let by = 'Ludwig van Beethoven';
try {
const quoteObj = quotes.getTodaysQuote();
q = quoteObj.body;
by = quoteObj.by;
}
catch (ex) {
// Lib not installed
}
console.log(chalk.green(q));
console.log(chalk.green('- ' + by));
console.log(chalk.blue("------------------------------------------------------------------------------\n"));
const donate = 'bc1pl6k2z5ra403zfeyevzsu7llh0mdqqn4802p4uqfhz6l7qzddq2mqduqvc6';
console.log('Thank you for your support and contributions to Atomicals CLI development! ❤️');
console.log(`Donation address: ${donate}\n`);
console.log(`Even a little goes a long way!\n`);
console.log(`Scan QR Code to Donate:`);
qrcode.generate(donate, { small: true });
}
function printFailure(data) {
console.log(JSON.stringify(data, null, 2));
}
function handleResultLogging(result, showDonation) {
if (!result || !result.success || !result.data) {
printFailure(result);
}
else {
printSuccess(result.data, showDonation);
}
}
function getRandomBitwork4() {
const r = Math.floor(1000 + Math.random() * 9000);
return r + '';
}
function groupAtomicalsUtxosByAtomicalId(atomical_utxos) {
const sorted = {};
// console.log('atomical_utxos', JSON.stringify(atomical_utxos, null, 2));
for (const utxo of atomical_utxos) {
for (const atomicalId of utxo['atomicals']) {
sorted[atomicalId] = sorted[atomicalId] || [];
sorted[atomicalId].push(Object.assign(Object.assign({}, utxo), { atomicals: undefined }));
}
}
return sorted;
}
function showWalletFTBalancesDetails(obj, showutxos = false, accumulated) {
const atomicalsUtxosByAtomicalId = groupAtomicalsUtxosByAtomicalId(obj.atomicals_utxos);
for (const atomicalId in obj.atomicals_balances) {
if (!obj.atomicals_balances.hasOwnProperty(atomicalId)) {
continue;
}
const atomical = obj.atomicals_balances[atomicalId];
if (atomical['type'] !== 'FT') {
continue;
}
console.log('-----');
console.log('Atomical id:', atomicalId);
console.log('Atomical number:', atomical['atomical_number']);
console.log('Atomical type:', atomical['type']);
console.log('Atomical subtype:', atomical['subtype']);
console.log('Requested ticker:', atomical['request_ticker']);
console.log('Requested ticker status:', atomical['request_ticker_status']['status']);
console.log('Ticker:', atomical['ticker']);
console.log('Confirmed balance:', atomical['confirmed']);
console.log('UTXOs for Atomical:', atomicalsUtxosByAtomicalId[atomicalId].length);
accumulated[atomical['ticker']] = accumulated[atomical['ticker']] || 0;
accumulated[atomical['ticker']] += atomical['confirmed'];
if (showutxos)
console.log(JSON.stringify(atomicalsUtxosByAtomicalId[atomicalId], null, 2));
}
return accumulated;
}
function showWalletDetails(obj, type, showExtra = false, showBalancesOnly = false) {
if (showBalancesOnly) {
const atomicalsUtxosByAtomicalId = groupAtomicalsUtxosByAtomicalId(obj.atomicals_utxos);
for (const atomicalId in obj.atomicals_balances) {
if (!obj.atomicals_balances.hasOwnProperty(atomicalId)) {
continue;
}
const atomical = obj.atomicals_balances[atomicalId];
if (atomical['type'] !== 'FT') {
continue;
}
console.log('-----');
console.log('Atomical id:', atomicalId);
console.log('Atomical number:', atomical['atomical_number']);
console.log('Atomical type:', atomical['type']);
console.log('Atomical subtype:', atomical['subtype']);
console.log('Requested ticker:', atomical['request_ticker']);
console.log('Requested ticker status:', atomical['request_ticker_status']['status']);
console.log('Ticker:', atomical['ticker']);
console.log('Confirmed balance:', atomical['confirmed']);
console.log('UTXOs for Atomical:', atomicalsUtxosByAtomicalId[atomicalId].length);
}
return;
}
if (showExtra) {
console.log(JSON.stringify(obj, null, 2));
}
else {
const atomicals_balances_summarized = {};
for (const atomicalId in obj.atomicals_balances) {
if (!obj.atomicals_balances.hasOwnProperty(atomicalId)) {
continue;
}
if (type !== "all" && obj.atomicals_balances[atomicalId]['type'].toLowerCase() !== type) {
continue;
}
atomicals_balances_summarized[atomicalId] = Object.assign(Object.assign({}, obj.atomicals_balances[atomicalId]), { data: undefined });
}
const summaryOnly = {
address: obj.address,
scripthash: obj.scripthash,
atomicals_count: obj.atomicals_count,
// atomicals_utxos: obj.atomicals_utxos,
atomicals_balances: atomicals_balances_summarized,
total_confirmed: obj.total_confirmed,
total_unconfirmed: obj.total_unconfirmed,
atomicals_confirmed: obj.atomicals_confirmed,
atomicals_unconfirmed: obj.atomicals_unconfirmed,
regular_confirmed: obj.regular_confirmed,
regular_unconfirmed: obj.regular_unconfirmed,
regular_utxo_count: obj.regular_utxo_count,
// regular_utxos: obj.regular_utxos,
};
console.log(JSON.stringify(summaryOnly, null, 2));
}
}
function resolveWalletAliasNew(walletInfo, alias, defaultValue) {
if (!alias) {
return defaultValue;
}
if (walletInfo[alias]) {
return walletInfo[alias];
}
if (walletInfo.imported[alias]) {
return walletInfo.imported[alias];
}
throw 'No wallet alias or valid address found: ' + alias;
}
function resolveAddress(walletInfo, alias, defaultValue) {
if (!alias) {
return defaultValue;
}
if (walletInfo[alias]) {
return walletInfo[alias];
}
if (walletInfo.imported[alias]) {
return walletInfo.imported[alias];
}
// As a last effort try and return the address
try {
(0, address_helpers_1.detectAddressTypeToScripthash)(alias);
return {
address: alias
};
}
catch (err) {
// Do nothing, but at least we tried
}
throw 'No wallet alias or valid address found: ' + alias;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// Start of Command Line Options Definitions
/////////////////////////////////////////////////////////////////////////////////////////////
const program = new commander_1.Command();
program
.name('Atomicals CLI Utility')
.description('Command line utility for interacting with Atomicals')
.version(require('../package.json').version);
program.command('server-version')
.description('Get electrumx server version info')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const result = yield atomicals.serverVersion();
console.log('result', result);
}
catch (error) {
console.log(error);
}
}));
/////////////////////////////////////////////////////////////////////////////////////////////
// Wallet and Local Wallet Commands
/////////////////////////////////////////////////////////////////////////////////////////////
program.command('wallet-create')
.description('Creates and displays new 12-word secret mnemonic phrase along with the primary and funding addresses')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
const result = yield _1.Atomicals.walletCreate();
console.log('Generated mnemonic phrase:', result);
console.log(`phrase: ${result.data.wallet.phrase}`);
console.log(`Primary address (P2TR): ${result.data.wallet.primary.address}`);
console.log(`Primary address WIF: ${result.data.wallet.primary.WIF}`);
console.log(`Primary address path: ${result.data.wallet.primary.path}`);
console.log(`Funding address (P2TR): ${result.data.wallet.funding.address}`);
console.log(`Funding address WIF: ${result.data.wallet.funding.WIF}`);
console.log(`Funding address path: ${result.data.wallet.funding.path}`);
console.log(JSON.stringify(result, null, 2));
console.log(`------------------------------------------------------`);
}));
program.command('wallet-decode')
.description('Decode secret mnemonic phrase to display derive address and key at provided path')
.argument('<phrase>', 'string')
.option('-p, --path <string>', 'Derivation path to use', `m/44'/0'/0'/0/0`)
.action((phrase, options) => __awaiter(void 0, void 0, void 0, function* () {
let path = options.path;
const result = yield _1.Atomicals.walletPhraseDecode(phrase, path);
console.log('Provided mnemonic phrase:');
console.log(`phrase: ${result.data.phrase}`);
console.log(`Requested Derivation Path: ${path}`);
console.log(`Address: ${result.data.address}`);
console.log(`Address path: ${result.data.path}`);
console.log(`Address WIF: ${result.data.WIF}`);
console.log(result);
console.log(`------------------------------------------------------`);
}));
program.command('wallet-init')
.description('Initializes a new wallet at wallet.json')
.option('--phrase <string>', 'Provide a wallet phrase')
.option('--path <string>', 'Provide a path base', `m/86'/0'/0'`)
.option('--n <number>', 'Provider number of alias')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const result = yield _1.Atomicals.walletInit(options.phrase, options.path, options.n ? parseInt(options.n, 10) : undefined);
console.log('Wallet created at wallet.json');
console.log(`phrase: ${result.data.phrase}`);
console.log(`Primary address (P2TR): ${result.data.primary.address}`);
console.log(`Primary address WIF: ${result.data.primary.WIF}`);
console.log(`Primary address path: ${result.data.primary.path}`);
console.log(`Funding address (P2TR): ${result.data.funding.address}`);
console.log(`Funding address WIF: ${result.data.funding.WIF}`);
console.log(`Funding address path: ${result.data.funding.path}`);
console.log(`Full Data: ${JSON.stringify(result.data, null, 2)}`);
console.log(`------------------------------------------------------`);
}
catch (err) {
console.log('Error', err);
}
}));
program.command('wallet-import')
.description('Import a wallet by WIF and assign it to provided alias')
.argument('<wif>', 'string')
.argument('<alias>', 'string')
.action((wif, alias, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield (0, validate_wallet_storage_1.validateWalletStorage)();
yield _1.Atomicals.walletImport(wif, alias);
console.log('Success! wallet.json updated');
}
catch (error) {
console.log(error);
}
}));
program.command('address-script')
.description('Encodes an address or wallet alias as the hex output script')
.argument('<addressOrAlias>', 'string')
.action((addressOrAlias, options) => __awaiter(void 0, void 0, void 0, function* () {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const result = (0, address_helpers_1.performAddressAliasReplacement)(walletInfo, addressOrAlias || undefined);
console.log('Address:', result.address);
console.log('Script:', result.output.toString('hex'));
console.log('Scripthash:', result.scripthash.toString());
console.log(`------------------------------------------------------`);
}));
program.command('script-address')
.description('Decodes a script as an address')
.argument('<script>', 'string')
.action((script, options) => __awaiter(void 0, void 0, void 0, function* () {
const result = (0, address_helpers_1.detectScriptToAddressType)(script);
console.log('Address:', result);
console.log(`------------------------------------------------------`);
}));
program.command('outpoint-compact')
.description('Decodes hex outpoint to compact location id form')
.argument('<hex>', 'string')
.action((hex, options) => __awaiter(void 0, void 0, void 0, function* () {
const result = (0, atomical_format_helpers_1.outpointToCompactId)(hex);
console.log('result:', result);
console.log(`------------------------------------------------------`);
}));
program.command('compact-outpoint')
.description('Encodes the compact id to outpoint hex format')
.argument('<compactId>', 'string')
.action((compactId, options) => __awaiter(void 0, void 0, void 0, function* () {
const result = (0, atomical_format_helpers_1.compactIdToOutpoint)(compactId);
console.log('result:', result);
console.log(`------------------------------------------------------`);
}));
program.command('address')
.description('Get balances and Atomicals stored at an address')
.argument('<address>', 'string')
.option('--history', 'Verbose output to include history or not')
.action((address, options) => __awaiter(void 0, void 0, void 0, function* () {
var _a;
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const history = options.history ? true : false;
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const receive = (0, address_helpers_1.performAddressAliasReplacement)(walletInfo, address || undefined);
const result = yield atomicals.addressInfo(receive.address, history);
qrcode.generate((_a = result.data) === null || _a === void 0 ? void 0 : _a.address, { small: false });
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('wallets')
.description('Get balances and atomicals stored at internal wallets')
.option('--history', 'Shows history of txids for each wallet if enabled')
.option('--all', 'Shows all loaded wallets and not just the primary and funding')
.option('--extra', 'Show extended wallet information such as specific utxos. Default is to only show a summary.')
.option('--balances', 'Show FT token balances')
.option('--noqr', 'Hide QR codes')
.option('--alias <string>', 'Restrict to only showing one of the imported wallets identified by the alias')
.option('--type <string>', 'Show NFT or FT types only. By default shows both. Not compatible with --balances and --extra')
.option('--identify <string>', 'Restrict to only showing one of the imported wallets identified by the address (if it is found)')
.option('--address <string>', 'Show the data and a QR code for an arbitrary address. Not expected to be loaded into local wallets.')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
try {
const all = options.all ? true : false;
const history = options.history ? true : false;
const alias = options.alias ? options.alias : null;
const extra = options.extra ? options.extra : null;
const address = options.address ? options.address : null;
const noqr = options.noqr ? options.noqr : null;
const balancesOnly = options.balances ? options.balances : null;
const identify = options.identify ? options.identify : null;
const show = options.address ? options.address : null;
const type = options.type ? options.type.toLowerCase() : 'all';
if (type !== 'all' && type !== 'nft' && type != 'ft') {
throw `Invalid type ${type}`;
}
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const electrum = electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || '');
const atomicals = new _1.Atomicals(electrum);
const keepElectrumAlive = true;
if (alias) {
if (!walletInfo.imported || !walletInfo.imported[alias]) {
throw `No wallet with alias ${alias}`;
}
let result = yield atomicals.walletInfo(walletInfo.imported[alias].address, history, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`Wallet Information - ${alias} Address - ${(_b = result.data) === null || _b === void 0 ? void 0 : _b.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_c = result.data) === null || _c === void 0 ? void 0 : _c.address, { small: false });
}
showWalletDetails(result.data, type, extra, balancesOnly);
}
else if (identify) {
console.log("\n========================================================================================================");
console.log(`Request Identify Wallet: ${identify}`);
console.log("========================================================================================================");
let foundWallet = false;
for (const walletAlias in walletInfo.imported) {
if (!walletInfo.imported[walletAlias]) {
continue;
}
if (walletInfo.imported[walletAlias].address === identify) {
foundWallet = true;
let result = yield atomicals.walletInfo(walletInfo.imported[walletAlias].address, history, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`Wallet Information - ${walletAlias} Address`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_d = result.data) === null || _d === void 0 ? void 0 : _d.address, { small: false });
}
showWalletDetails(result.data, type, extra, balancesOnly);
}
}
if (!foundWallet) {
console.log(`No imported wallet found with address ${identify}`);
}
}
else if (show) {
console.log("\n========================================================================================================");
console.log(`Request Show Address: ${show}`);
console.log("========================================================================================================");
let result = yield atomicals.walletInfo(show, history, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`Address Information - ${show} Address - ${(_e = result.data) === null || _e === void 0 ? void 0 : _e.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_f = result.data) === null || _f === void 0 ? void 0 : _f.address, { small: false });
}
showWalletDetails(result.data, type, extra, balancesOnly);
}
else {
// Just show the primary and funding address
let result = yield atomicals.walletInfo(walletInfo.primary.address, history, keepElectrumAlive);
console.log('walletInfo result', result);
console.log("\n========================================================================================================");
console.log(`1. Wallet Information - Primary Address - ${(_g = result.data) === null || _g === void 0 ? void 0 : _g.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_h = result.data) === null || _h === void 0 ? void 0 : _h.address, { small: false });
}
showWalletDetails(result.data, type, extra, balancesOnly);
result = yield atomicals.walletInfo(walletInfo.funding.address, history, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`2. Wallet Information - Funding Address - ${(_j = result.data) === null || _j === void 0 ? void 0 : _j.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_k = result.data) === null || _k === void 0 ? void 0 : _k.address, { small: false });
}
showWalletDetails(result.data, type, extra, balancesOnly);
if (all) {
let counter = 3;
if (walletInfo.imported) {
for (const walletAlias in walletInfo.imported) {
if (!walletInfo.imported.hasOwnProperty(walletAlias)) {
continue;
}
result = yield atomicals.walletInfo(walletInfo.imported[walletAlias].address, history, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`${counter}. Wallet Information - ${walletAlias} Address - ${(_l = result.data) === null || _l === void 0 ? void 0 : _l.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_m = result.data) === null || _m === void 0 ? void 0 : _m.address, { small: false });
}
showWalletDetails(result.data, type, extra, balancesOnly);
counter++;
}
}
}
}
console.log("\n\n");
yield electrum.close();
}
catch (error) {
console.log(error);
}
}));
program.command('balances')
.description('Get balances and atomicals stored at internal wallets')
.option('--noqr', 'Hide QR codes')
.option('--utxos', 'Show utxos too')
.option('--all', 'Shows all loaded wallets and not just the primary and funding')
.option('--alias <string>', 'Restrict to only showing one of the imported wallets identified by the alias')
.option('--address <string>', 'Restrict to only showing by address. Using this option with --alias has no effect.')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
var _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
try {
const alias = options.alias ? options.alias : null;
const noqr = options.noqr ? options.noqr : null;
const address = options.address ? options.address : null;
const all = options.all ? true : false;
const utxos = options.utxos ? true : false;
const balancesOnly = true;
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const electrum = electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || '');
const atomicals = new _1.Atomicals(electrum);
const keepElectrumAlive = true;
let accumulated = {};
if (alias) {
if (!walletInfo.imported || !walletInfo.imported[alias]) {
throw `No wallet with alias ${alias}`;
}
let result = yield atomicals.walletInfo(walletInfo.imported[alias].address, false, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`Wallet Information - ${alias} Address - ${(_o = result.data) === null || _o === void 0 ? void 0 : _o.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_p = result.data) === null || _p === void 0 ? void 0 : _p.address, { small: false });
}
accumulated = showWalletFTBalancesDetails(result.data, utxos, accumulated);
}
else if (address) {
let result = yield atomicals.walletInfo(address, false, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`Wallet Information - Address - ${(_q = result.data) === null || _q === void 0 ? void 0 : _q.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_r = result.data) === null || _r === void 0 ? void 0 : _r.address, { small: false });
}
accumulated = showWalletFTBalancesDetails(result.data, utxos, accumulated);
}
else {
// Just show the primary and funding address
let result = yield atomicals.walletInfo(walletInfo.primary.address, false, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`1. Wallet Information - Primary Address - ${(_s = result.data) === null || _s === void 0 ? void 0 : _s.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_t = result.data) === null || _t === void 0 ? void 0 : _t.address, { small: false });
}
accumulated = showWalletFTBalancesDetails(result.data, utxos, accumulated);
result = yield atomicals.walletInfo(walletInfo.funding.address, false, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`2. Wallet Information - Funding Address - ${(_u = result.data) === null || _u === void 0 ? void 0 : _u.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_v = result.data) === null || _v === void 0 ? void 0 : _v.address, { small: false });
}
accumulated = showWalletFTBalancesDetails(result.data, utxos, accumulated);
if (all) {
let counter = 3;
if (walletInfo.imported) {
for (const walletAlias in walletInfo.imported) {
if (!walletInfo.imported.hasOwnProperty(walletAlias)) {
continue;
}
result = yield atomicals.walletInfo(walletInfo.imported[walletAlias].address, false, keepElectrumAlive);
console.log("\n========================================================================================================");
console.log(`${counter}. Wallet Information - ${walletAlias} Address - ${(_w = result.data) === null || _w === void 0 ? void 0 : _w.address}`);
console.log("========================================================================================================");
if (!noqr) {
qrcode.generate((_x = result.data) === null || _x === void 0 ? void 0 : _x.address, { small: false });
}
accumulated = showWalletFTBalancesDetails(result.data, utxos, accumulated);
counter++;
}
}
}
}
console.log("\n\n");
console.log(accumulated);
yield electrum.close();
}
catch (error) {
console.log(error);
}
}));
program.command('address-utxos')
.description('List all utxos owned by an address')
.argument('<address>', 'string')
.action((address, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
// address = performAddressAliasReplacement(walletInfo, address);
const receive = (0, address_helpers_1.performAddressAliasReplacement)(walletInfo, address || undefined);
const result = yield atomicals.getUtxos(receive.address);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('address-history')
.description('List address history of an address')
.argument('<address>', 'string')
.action((address, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const receive = (0, address_helpers_1.performAddressAliasReplacement)(walletInfo, address || undefined);
const result = yield atomicals.getHistory(receive.address);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('tx')
.description('Get any transaction')
.argument('<txid>', 'string')
.option('--verbose', 'Verbose output')
.action((txid, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield (0, validate_wallet_storage_1.validateWalletStorage)();
const verbose = options.verbose ? true : false;
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const result = yield atomicals.getTx(txid, verbose);
console.log(JSON.stringify(result, null, 2));
}
catch (error) {
console.log(error);
}
}));
/////////////////////////////////////////////////////////////////////////////////////////////
// Name Retrieval Commands (Tickers, (Sub)Realms, Containers)
/////////////////////////////////////////////////////////////////////////////////////////////
/**
* Resolve a realm or subrealm
*
* @param realm_or_subrealm Realm or subrealm to resolve
* @param options
*/
const resolveRealmAction = (realm_or_subrealm, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const result = yield atomicals.getAtomicalByRealm(realm_or_subrealm);
console.log(JSON.stringify(result, null, 2));
}
catch (error) {
console.log(error);
}
});
program.command('get-ticker')
.description('Get Atomical by ticker name')
.argument('<ticker>', 'string')
.option('--verbose', 'Verbose to show extended information.')
.action((ticker, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const result = yield atomicals.getAtomicalByTicker(ticker);
console.log(JSON.stringify(result, null, 2));
}
catch (error) {
console.log(error);
}
}));
program.command('get-container')
.description('Get Atomical by container name')
.argument('<container>', 'string')
.option('--verbose', 'Verbose to show extended information.')
.action((container, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const result = yield atomicals.getAtomicalByContainer(container);
console.log(JSON.stringify(result, null, 2));
}
catch (error) {
console.log(error);
}
}));
program.command('get-container-items')
.description('Get the items in the container')
.argument('<container>', 'string')
.argument('<limit>', 'number')
.argument('<offset>', 'number')
.option('--verbose', 'Verbose output')
.action((container, limit, offset, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const result = yield atomicals.getContainerItems(container, parseInt(limit, 10), parseInt(offset, 10));
console.log(JSON.stringify(result, null, 2));
}
catch (error) {
console.log(error);
}
}));
program.command('get-container-item')
.description('Get an item in the container')
.argument('<container>', 'string')
.argument('<itemId>', 'string')
.option('--verbose', 'Verbose output')
.action((container, itemId, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const modifiedStripped = container.indexOf('#') === 0 ? container.substring(1) : container;
const result = yield atomicals.getAtomicalByContainerItem(modifiedStripped, itemId);
console.log(JSON.stringify(result, null, 2));
}
catch (error) {
console.log(error);
}
}));
program.command('validate-container-item')
.description('Validate a container item from the manifest')
.argument('<containerName>', 'string')
.argument('<itemName>', 'string')
.argument('<manifestFile>', 'string')
.action((containerName, itemName, manifestFile, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const result = yield atomicals.getAtomicalByContainerItemValidated(containerName, itemName, manifestFile);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('resolve')
.description(`Resolve a realm or subrealm. Alias for 'get-realm'`)
.argument('<realm_or_subrealm>', 'string')
.option('--verbose', 'Verbose to show extended information.')
.action((realm_or_subrealm, options) => __awaiter(void 0, void 0, void 0, function* () {
yield resolveRealmAction(realm_or_subrealm, options);
}));
program.command('get-realm')
.description(`Resolve a realm or subrealm. Alias for 'resolve'`)
.argument('<realm_or_subrealm>', 'string')
.option('--verbose', 'Verbose to show extended information.')
.action((realm_or_subrealm, options) => __awaiter(void 0, void 0, void 0, function* () {
yield resolveRealmAction(realm_or_subrealm, options);
}));
program.command('realm-info')
.description('Get realm and subrealm information of an atomical')
.argument('<atomicalIdAlias>', 'string')
.option('--verbose', 'Verbose output')
.action((atomicalAliasOrId, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const verbose = options.verbose ? true : false;
const modifiedStripped = atomicalAliasOrId.indexOf('+') === 0 ? atomicalAliasOrId.substring(1) : atomicalAliasOrId;
const result = yield atomicals.getRealmInfo(modifiedStripped, verbose);
console.log(JSON.stringify(result, null, 2));
}
catch (error) {
console.log(error);
}
}));
program.command('summary-subrealms')
.description('Show summary of owned subrealms by wallet')
.option('--owner <string>', 'Provide alternate wallet alias to query')
.option('--filter <string>', 'Filter by status')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
let ownerWalletRecord = resolveWalletAliasNew(walletInfo, options.owner, walletInfo.primary);
const filter = options.filter ? options.filter : undefined;
const result = yield atomicals.summarySubrealms(ownerWalletRecord.address, filter);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('summary-containers')
.description('Show summary of owned containers by wallet')
.option('--owner <string>', 'Provide alternate wallet alias to query')
.option('--filter <string>', 'Filter by status')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
let ownerWalletRecord = resolveWalletAliasNew(walletInfo, options.owner, walletInfo.primary);
const filter = options.filter ? options.filter : undefined;
const result = yield atomicals.summaryContainers(ownerWalletRecord.address, filter);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('summary-realms')
.description('Show summary of owned realms by wallet')
.option('--owner <string>', 'Provide alternate wallet alias to query')
.option('--filter <string>', 'Filter by status')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
let ownerWalletRecord = resolveWalletAliasNew(walletInfo, options.owner, walletInfo.primary);
const filter = options.filter ? options.filter : undefined;
const result = yield atomicals.summaryRealms(ownerWalletRecord.address, filter);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('summary-tickers')
.description('Show summary of owned tokens by tickers by wallet')
.option('--owner <string>', 'Provide alternate wallet alias to query')
.option('--filter <string>', 'Filter by status')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
let ownerWalletRecord = resolveWalletAliasNew(walletInfo, options.owner, walletInfo.primary);
const filter = options.filter ? options.filter : undefined;
const result = yield atomicals.summaryTickers(ownerWalletRecord.address, filter);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('find-tickers')
.description('Search tickers')
.option('--q <string>', 'Search query')
.option('--asc <string>', 'Sort by ascending', 'true')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const verbose = options.verbose ? true : false;
const q = options.q ? options.q : null;
const asc = options.asc === 'true' ? true : false;
const result = yield atomicals.searchTickers(q, verbose, asc);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('find-realms')
.description('Search realms')
.option('--q <string>', 'Search query')
.option('--asc <string>', 'Sort by ascending', 'true')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const verbose = options.verbose ? true : false;
const q = options.q ? options.q : null;
const asc = options.asc === 'true' ? true : false;
const result = yield atomicals.searchRealms(q, verbose, asc);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('find-containers')
.description('Search containers')
.option('--q <string>', 'Search query')
.option('--asc <string>', 'Sort by ascending', 'true')
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
const verbose = options.verbose ? true : false;
const q = options.q ? options.q : null;
const asc = options.asc === 'true' ? true : false;
const result = yield atomicals.searchContainers(q, verbose, asc);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
/////////////////////////////////////////////////////////////////////////////////////////////
// Modify, Updates, Events, Delete...
/////////////////////////////////////////////////////////////////////////////////////////////
program.command('set')
.description('Set (update) an existing Atomical with data.')
.argument('<atomicalIdAlias>', 'string')
.argument('<jsonFilename>', 'string')
.option('--rbf', 'Whether to enable RBF for transactions.')
.option('--funding <string>', 'Use wallet alias WIF key to be used for funding')
.option('--owner <string>', 'Use wallet alias WIF key to move the Atomical')
.option('--satsbyte <number>', 'Satoshis per byte in fees', '15')
.option('--satsoutput <number>', 'Satoshis to put into output', '1000')
.option('--disableautoencode', 'Disables auto encoding of $b variables')
.option('--bitworkc <string>', 'Whether to add any bitwork proof of work to the commit tx')
.action((atomicalId, jsonFilename, options) => __awaiter(void 0, void 0, void 0, function* () {
try {
const walletInfo = yield (0, validate_wallet_storage_1.validateWalletStorage)();
const config = (0, validate_cli_inputs_1.validateCliInputs)();
const atomicals = new _1.Atomicals(electrum_api_1.ElectrumApi.createClient(process.env.ELECTRUMX_PROXY_BASE_URL || ''));
let fundingWalletRecord = resolveWalletAliasNew(walletInfo, options.funding, walletInfo.funding);
let ownerWalletRecord = resolveWalletAliasNew(walletInfo, options.owner, walletInfo.primary);
const result = yield atomicals.setInteractive({
rbf: options.rbf,
satsbyte: parseInt(options.satsbyte, 10),
satsoutput: parseInt(options.satsoutput, 10),
disableautoencode: !!options.disableautoencode,
bitworkc: options.bitworkc ? options.bitworkc : '8',
}, atomicalId, jsonFilename, fundingWalletRecord, ownerWalletRecord);
handleResultLogging(result);
}
catch (error) {
console.log(error);
}
}));
program.command('set-container-data')
.description('Update container data with json file contents')
.argument('<containerName>', 'string')
.argument('<jsonFilename>', 'string')
.option('--rbf', 'Whether to enable RBF for transactions.')
.option('--funding <string>', 'Use wallet alias WIF key to be used for funding')
.option('--owner <string>', 'Use wallet alias WIF key to move the Atomical')
.