@ledgerhq/coin-icon
Version:
Ledger Icon Coin integration
123 lines • 4.57 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTxHistory = exports.fetchOperationList = exports.getOperations = exports.getCurrentBlockHeight = exports.getAccount = void 0;
const network_1 = __importDefault(require("@ledgerhq/live-network/network"));
const bignumber_js_1 = require("bignumber.js");
const operation_1 = require("@ledgerhq/coin-framework/operation");
const constants_1 = require("../constants");
const logic_1 = require("../logic");
const logs_1 = require("@ledgerhq/logs");
const querystring_1 = __importDefault(require("querystring"));
const config_1 = require("../config");
/**
* Returns Testnet API URL if the current network is testnet
*
* @param {network} network
*/
function getApiUrl(network) {
const currencyConfig = (0, config_1.getCoinConfig)();
let apiUrl = currencyConfig.infra.indexer;
if ((0, logic_1.isTestnet)(network)) {
apiUrl = currencyConfig.infra.indexer_testnet;
}
return apiUrl;
}
async function fetch(url) {
const { data } = await (0, network_1.default)({
method: "GET",
url,
});
if (data.Error) {
(0, logs_1.log)("icon-error", data.Error, {
url,
});
throw new Error(data.Error);
}
return data;
}
const getAccount = async (addr, network) => {
const data = await fetch(`${getApiUrl(network)}/addresses/details/${addr}`);
return data;
};
exports.getAccount = getAccount;
const getCurrentBlockHeight = async (network) => {
const data = await fetch(`${getApiUrl(network)}/blocks`);
return data?.[0].number;
};
exports.getCurrentBlockHeight = getCurrentBlockHeight;
/**
* Returns true if account is the signer
*/
function isSender(transaction, addr) {
return transaction.from_address === addr;
}
/**
* Map transaction to an Operation Type
*/
function getOperationType(transaction, addr) {
return isSender(transaction, addr) ? "OUT" : "IN";
}
/**
* Map transaction to a correct Operation Value (affecting account balance)
*/
function getOperationValue(transaction, addr) {
if (isSender(transaction, addr)) {
return transaction.value
? new bignumber_js_1.BigNumber(transaction.value).plus(transaction.transaction_fee)
: new bignumber_js_1.BigNumber(0);
}
else {
return transaction.value ? new bignumber_js_1.BigNumber(transaction.value) : new bignumber_js_1.BigNumber(0);
}
}
/**
* Map the ICON history transaction to a Ledger Live Operation
*/
function txToOperation(accountId, addr, transaction) {
const type = getOperationType(transaction, addr);
return {
id: (0, operation_1.encodeOperationId)(accountId, transaction.hash, type),
accountId,
fee: new bignumber_js_1.BigNumber(transaction.transaction_fee),
value: getOperationValue(transaction, addr),
type,
hash: transaction.hash,
blockHash: null,
blockHeight: transaction.block_number,
date: new Date(transaction.block_timestamp / 1000),
senders: [transaction.from_address],
recipients: [transaction.to_address],
extra: {},
hasFailed: transaction.status !== "0x1",
};
}
/**
* Fetch operation list
*/
const getOperations = async (accountId, addr, skip, network, maxLength) => {
return await (0, exports.fetchOperationList)(accountId, addr, skip, network, maxLength);
};
exports.getOperations = getOperations;
const fetchOperationList = async (accountId, addr, skip, network, maxLength, prevOperations = []) => {
const data = await (0, exports.getTxHistory)(addr, skip, network);
const operations = data.map((transaction) => txToOperation(accountId, addr, transaction));
const mergedOp = [...prevOperations, ...operations];
if (operations.length < constants_1.LIMIT || operations.length >= maxLength) {
return mergedOp;
}
return await (0, exports.fetchOperationList)(accountId, addr, skip + constants_1.LIMIT, network, maxLength, mergedOp);
};
exports.fetchOperationList = fetchOperationList;
const getTxHistory = async (addr, skip, network, limit = constants_1.LIMIT) => {
const query = querystring_1.default.stringify({
skip: skip,
limit: limit,
});
const data = await fetch(`${getApiUrl(network)}/transactions/address/${addr}?${query}`);
return data;
};
exports.getTxHistory = getTxHistory;
//# sourceMappingURL=index.js.map