# Взаимодействие с нодой
Вы можете взаимодействоваь с API-методами Assets и Addresses.
# Assets API
Вы можете получить информацию о:
- Распределении баланса активов.
- Балансе активов по адресу.
- Балансе актива по адресу.
- Об активе.
- Наличии NFT-токенах по адресу.
# Распределение баланса активов
Endpoint: GET /assets/{assetId}/distribution/{height}/limit/{limit}
async function getAssetDistributionRaw(
assetId: string,
limit = 100
): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl = 'https://nodes-testnet.wavesnodes.com';
// Получение высоты последнего блока.
const heightResp = await fetch(`${nodeUrl}/blocks/height`);
const heightData: { height: number } = await heightResp.json();
const height = heightData.height - 1;
// Создание URL-запроса.
const url = `${nodeUrl}/assets/${assetId}/distribution/${height}/limit/${limit}`;
const resp = await fetch(url);
// Преобразование ответа запроса в текст.
const text: string = await resp.text();
// Regex-выражение для нахождения необходимых значений.
const entryRegex = /"([1-9A-HJ-NP-Za-km-z]{30,})":(\d+)/g;
// Вывод результатов.
console.log('––––––––––––––––––––––––––––––––––––––');
console.log('Распределение активов (адрес: количество):');
let match: RegExpExecArray | null;
while ((match = entryRegex.exec(text)) !== null) {
const address: string = match[1];
const balanceLamports: number = Number(match[2]);
const balanceInWaves: number = balanceLamports / 100;
console.log(`${address}: ${balanceInWaves.toFixed(2)}`);
}
// Проверка наличия дополнтиельных страниц с данными для пагинации.
if (text.includes('"hasNext":true')) {
const lastItemMatch = /"lastItem":"(.*?)"/.exec(text);
if (lastItemMatch) {
console.log(`\Доступно больше страниц. Последний элемент: ${lastItemMatch[1]}`);
}
}
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите ID актива.
const assetId = 'УКАЖИТЕ ID АКТИВА';
getAssetDistributionRaw(assetId);
# Баланс активов по адресу
Endpoint: GET /assets/balance/{address}
async function getAllAssetBalancesForAddress(address: string): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/assets/balance/${address}`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const data: {
address: string;
balances: { assetId: string; balance: number }[];
} = await resp.json();
// Получение данных балансов.
const balances = data.balances || [];
console.log('––––––––––––––––––––––––––––––––––––––');
console.log(`Баланс активов по адресу: ${address}`);
// Вывод результатов.
for (const b of balances) {
const assetId: string = b.assetId;
const raw: number = Number(b.balance);
const formatted: number = raw / 100;
console.log(`ID актива: ${assetId}, Баланс: ${formatted.toFixed(2)}`);
}
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address: string = 'УКАЖИТЕ АДРЕС';
getAllAssetBalancesForAddress(address);
# Баланс актива по адресу
Endpoint: GET /assets/balance/{address}/{assetId}
async function getBalanceOfSpecificAsset(address: string, assetId: string): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/assets/balance/${address}/${assetId}`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const data: {
address: string;
assetId: string;
balance: number;
} = await resp.json();
// Получение и форматирование данных баланса.
const raw: number = Number(data.balance);
const formatted: number = raw / 100;
// Вывод результатов.
console.log('––––––––––––––––––––––––––––––––––––––');
console.log(`Баланс актива ${data.assetId} по адресу ${data.address}: ${formatted.toFixed(2)}`);
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address: string = 'УКАЖИТЕ АДРЕС';
// Укажите ID актива.
const assetId: string = 'УКАЖИТЕ ID АКТИВА';
getBalanceOfSpecificAsset(address, assetId);
# Детали актива
Endpoint: GET /assets/details/{assetId}
async function getAssetDetails(assetId: string): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/assets/details/${assetId}`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const data: {
name: string;
description: string;
decimals: number;
reissuable: boolean;
issuer: string;
} = await resp.json();
// Вывод результатов.
console.log('––––––––––––––––––––––––––––––––––––––');
console.log(`Наименование: ${data.name}`);
console.log(`Описание: ${data.description}`);
console.log(`Знаков после запятой: ${data.decimals}`);
console.log(`Перевыпускаемость: ${data.reissuable}`);
console.log(`Создатель: ${data.issuer}`);
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите ID актива.
const assetId: string = 'УКАЖИТЕ ID АКТИВА';
getAssetDetails(assetId);
# Наличие NFT-токенов по адресу
Endpoint: GET /assets/nft/{address}/limit/{limit}
async function getNFTsByAddress(address: string, limit: number = 100): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/assets/nft/${address}/limit/${limit}`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const nfts: {
assetId: string;
name: string;
description: string;
quantity: number;
}[] = await resp.json();
// Вывод результатов.
console.log('––––––––––––––––––––––––––––––––––––––');
console.log(`NFT-активы по адерсу: ${address}`);
for (const nft of nfts) {
console.log(`ID: ${nft.assetId} | Наименование: ${nft.name} | Описание: ${nft.description} | Количество: ${nft.quantity}`);
}
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address: string = 'УКАЖИТЕ АДРЕС';
getNFTsByAddress(address);
# Addresses API
Вы можете получить информацию о:
- Всех адресах в кошельке ноды.
- Диапазоне адресов.
- Балансе WAVES по адресу.
- Балансе WAVES с подтверждениями.
- Детальной информации о балансе.
- Балансе нескольких адресов.
- Записях данных аккаунта по адресу.
- Записях данных по ключу.
- Скрипте аккаунта.
# Все адреса в кошельке ноды
Endpoint: GET /addresses
async function getAllNodeWalletAddresses(): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/addresses`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const addresses: string[] = await resp.json();
// Вывод результатов.
console.log('Адреса в кошельке ноды:');
addresses.forEach((addr: string): void => {
console.log(addr);
});
} catch (error) {
console.error('Ошибка:', error);
}
}
getAllNodeWalletAddresses();
# Диапазон адресов
Endpoint: GET /addresses/seq/{from}/{to}
async function getAddressRange(from: number, to: number): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/addresses/seq/${from}/${to}`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const addresses: string[] = await resp.json();
// Вывод результатов.
console.log(`Адрес с индексом от ${from} до ${to}:`);
addresses.forEach((address: string): void => {
console.log(address);
});
} catch (error) {
console.error('Ошибка:', error);
}
}
// Диапазон индексов кошельков.
const from = 0;
const to = 4;
getAddressRange(from, to);
# Баланс WAVES по адресу
Endpoint: GET /addresses/balance/{address}
async function getWavesBalance(address: string): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/addresses/balance/${address}`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const data: { balance: number } = await resp.json();
// Конвертация баланса.
const wavesBalance = data.balance / 1e8;
// Вывод результатов.
console.log(`Баланс по адресу ${address}: ${wavesBalance.toFixed(8)} в WAVES`);
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address = 'УКАЖИТЕ АДРЕС';
getWavesBalance(address);
# Баланс WAVES с подтверждениями
Endpoint: GET /addresses/balance/{address}/{confirmations}
async function getWavesBalanceWithConfirmations(address: string, confirmations: number): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/addresses/balance/${address}/${confirmations}`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const data: { balance: number } = await resp.json();
// Конвертация баланса.
const wavesBalance = data.balance / 1e8;
// Вывод результатов.
console.log(`Баланс по адресу ${address} (с количеством подтверждений <= ${confirmations}): ${wavesBalance.toFixed(8)} WAVES`);
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address = 'УКАЖИТЕ АДРЕС';
// Укажите количество подтверждений.
const confirmations = 2;
getWavesBalanceWithConfirmations(address, confirmations);
# Детальная информация о балансе
Endpoint: GET /addresses/balance/details/{address}
Обратите внимание: Метод показывает доступные, регулярные, генерирующие и эффективные остатки на счету аккаунта.
async function getDetailedBalanceInfo(address: string): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl: string = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url: string = `${nodeUrl}/addresses/balance/details/${address}`;
// Получение ответа на данный запрос.
const resp: Response = await fetch(url);
const info: {
regular: number;
available: number;
generating: number;
effective: number;
} = await resp.json();
// Вывод результатов.
console.log(`Регулярный: ${(info.regular / 1e8).toFixed(8)} WAVES`);
console.log(`Доступный: ${(info.available / 1e8).toFixed(8)} WAVES`);
console.log(`Генерирующий: ${(info.generating / 1e8).toFixed(8)} WAVES`);
console.log(`Эффективный: ${(info.effective / 1e8).toFixed(8)} WAVES`);
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address = 'УКАЖИТЕ АДРЕС';
getDetailedBalanceInfo(address);
# Баланс нескольких адресов
Endpoint: POST /addresses/balance
async function getBalancesForMultipleAddresses(addresses: string[]): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/addresses/balance"
* - Testnet: "https://nodes-testnet.wavesnodes.com/addresses/balance"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/addresses/balance"
*/
const nodeUrl = 'https://nodes-testnet.wavesnodes.com/addresses/balance';
// Создание POST-запрсоа.
const body = JSON.stringify({ addresses });
// Отправка POST-запроса
const resp = await fetch(nodeUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body,
});
// Parse the response.
const results: { address: string; balance: number }[] = await resp.json();
// Вывод результатов.
for (let i = 0; i < addresses.length; i++) {
const entry = results[i];
const balance = entry.balance / 1e8;
console.log(`${addresses[i]}: ${balance.toFixed(8)} WAVES`);
}
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адреса аккаунтов.
const addresses = [
'УКАЖИТЕ 1-ЫЙ АДРЕС',
'УКАЖИТЕ 2-ЫЙ АДРЕС'
// ...
];
getBalancesForMultipleAddresses(addresses);
# Записи данных аккаунта по адресу
Endpoint: GET /addresses/data/{address}
async function getAccountDataEntries(address: string): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url = `${nodeUrl}/addresses/data/${address}`;
// Получение ответа на данный запрос.
const resp = await fetch(url);
// Парсинг JSON-данных.
type DataEntry = { key: string; type: string; value: any };
const entries: DataEntry[] = await resp.json();
// Вывод результатов.
entries.forEach(e => {
console.log(`${e.key} (${e.type}): ${e.value}`);
});
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address = 'УКАЖИТЕ АДРЕС';
getAccountDataEntries(address);
# Записи данных по ключу
Endpoint: GET /addresses/data/{address}/{key}
async function getDataEntryByKey(address: string, key: string): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url = `${nodeUrl}/addresses/data/${address}/${key}`;
// Получение ответа на данный запрос.
const resp = await fetch(url);
// Парсинг JSON-данных.
type DataEntry = { key: string; type: string; value: any };
const entry: DataEntry = await resp.json();
// Вывод результатов.
console.log(`${entry.key} (${entry.type}): ${entry.value}`);
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address = 'УКАЖИТЕ АДРЕС';
// Укажите ключ аккаунта.
const key = 'УКАЖИТЕ КЛЮЧ АККАУНТА';
getDataEntryByKey(address, key);
# Информация о скрипте аккаунта
Endpoint: GET /addresses/scriptInfo/{address}
async function getScriptInfo(address: string): Promise<void> {
try {
/*
* Укажите ссылку на ноду в нужной сети:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
const nodeUrl = 'https://nodes-testnet.wavesnodes.com';
// Создание URL-запроса.
const url = `${nodeUrl}/addresses/scriptInfo/${address}`;
// Получение ответа на данный запрос.
const resp = await fetch(url);
// Парсинг JSON-данных.
type ScriptInfoResponse = {
script: string | null;
complexity?: number;
extraFee?: number;
};
const info: ScriptInfoResponse = await resp.json();
// Вывод результатов.
console.log(`Has Script: ${info.script !== null}`);
if (info.script !== null) {
console.log(`Сложность: ${info.complexity}`);
console.log(`Дополнительная комиссия: ${info.extraFee}`);
}
} catch (error) {
console.error('Ошибка:', error);
}
}
// Укажите адрес аккаунта.
const address = 'УКАЖИТЕ АДРЕС';
getScriptInfo(address);