ripple-lib
Version:
Deprecated - consider migrating to xrpl.js: https://xrpl.org/xrpljs2-migration-guide.html
150 lines • 6.54 kB
JavaScript
;
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 });
exports.getFaucetUrl = exports.FaucetNetwork = void 0;
const https = require("https");
const common_1 = require("../common");
const schema_validator_1 = require("../common/schema-validator");
const errors_1 = require("../common/errors");
var FaucetNetwork;
(function (FaucetNetwork) {
FaucetNetwork["Testnet"] = "faucet.altnet.rippletest.net";
FaucetNetwork["Devnet"] = "faucet.devnet.rippletest.net";
})(FaucetNetwork = exports.FaucetNetwork || (exports.FaucetNetwork = {}));
const INTERVAL_SECONDS = 1;
const MAX_ATTEMPTS = 20;
function generateFaucetWallet(address) {
return __awaiter(this, void 0, void 0, function* () {
if (!this.isConnected())
throw new errors_1.RippledError("RippleAPI not connected, cannot call faucet");
let body;
let startingBalance = 0;
let faucetUrl = getFaucetUrl(this);
if (address && schema_validator_1.isValidAddress(address)) {
body = new TextEncoder().encode(JSON.stringify({
destination: address
}));
const addressToFundBalance = yield getAddressXrpBalance(this, address);
if (addressToFundBalance && !isNaN(+addressToFundBalance)) {
startingBalance = +addressToFundBalance;
}
else {
startingBalance = 0;
}
}
const options = {
hostname: faucetUrl,
port: 443,
path: '/accounts',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': body ? body.length : 0
}
};
return new Promise((resolve, reject) => {
const request = https.request(options, (response) => {
const chunks = [];
response.on('data', (d) => {
chunks.push(d);
});
response.on('end', () => __awaiter(this, void 0, void 0, function* () {
const body = Buffer.concat(chunks).toString();
if (response.headers['content-type'].startsWith('application/json')) {
const wallet = JSON.parse(body);
const classicAddress = wallet.account.classicAddress;
if (classicAddress) {
try {
const isFunded = yield hasAddressBalanceIncreased(this, classicAddress, startingBalance);
if (isFunded) {
resolve(wallet);
}
else {
reject(new common_1.errors.XRPLFaucetError(`Unable to fund address with faucet after waiting ${INTERVAL_SECONDS * MAX_ATTEMPTS} seconds`));
}
}
catch (err) {
reject(new common_1.errors.XRPLFaucetError(err));
}
}
else {
reject(new common_1.errors.XRPLFaucetError(`The faucet account classic address is undefined`));
}
}
else {
reject({
statusCode: response.statusCode,
contentType: response.headers['content-type'],
body
});
}
}));
});
request.write(body ? body : '');
request.on('error', (error) => {
reject(error);
});
request.end();
});
});
}
function getAddressXrpBalance(api, address) {
return __awaiter(this, void 0, void 0, function* () {
try {
const balances = yield api.getBalances(address);
const xrpBalance = balances.filter((balance) => balance.currency.toUpperCase() === 'XRP');
return xrpBalance[0].value;
}
catch (err) {
return `Unable to retrieve ${address} balance. Error: ${err}`;
}
});
}
function hasAddressBalanceIncreased(api, address, originalBalance) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
let attempts = MAX_ATTEMPTS;
const interval = setInterval(() => __awaiter(this, void 0, void 0, function* () {
if (attempts < 0) {
clearInterval(interval);
resolve(false);
}
else {
attempts--;
}
try {
const newBalance = +(yield getAddressXrpBalance(api, address));
if (newBalance > originalBalance) {
clearInterval(interval);
resolve(true);
}
}
catch (err) {
clearInterval(interval);
reject(new common_1.errors.XRPLFaucetError(`Unable to check if the address ${address} balance has increased. Error: ${err}`));
}
}), INTERVAL_SECONDS * 1000);
});
});
}
function getFaucetUrl(api) {
const connectionUrl = api.connection.getUrl();
if (connectionUrl.includes('altnet') || connectionUrl.includes('testnet')) {
return FaucetNetwork.Testnet;
}
if (connectionUrl.includes('devnet')) {
return FaucetNetwork.Devnet;
}
return undefined;
}
exports.getFaucetUrl = getFaucetUrl;
exports.default = generateFaucetWallet;
//# sourceMappingURL=wallet-generation.js.map