evernode-js-client 0.6.53 → 0.6.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js
CHANGED
@@ -9189,7 +9189,7 @@ module.exports = { mask, unmask };
|
|
9189
9189
|
|
9190
9190
|
|
9191
9191
|
try {
|
9192
|
-
module.exports = require(__nccwpck_require__.ab + "prebuilds/linux-x64/node.
|
9192
|
+
module.exports = require(__nccwpck_require__.ab + "prebuilds/linux-x64/node.napi.node");
|
9193
9193
|
} catch (e) {
|
9194
9194
|
module.exports = __nccwpck_require__(9467);
|
9195
9195
|
}
|
@@ -38321,7 +38321,7 @@ module.exports = isValidUTF8;
|
|
38321
38321
|
|
38322
38322
|
|
38323
38323
|
try {
|
38324
|
-
module.exports = require(__nccwpck_require__.ab + "prebuilds/linux-x64/node.
|
38324
|
+
module.exports = require(__nccwpck_require__.ab + "prebuilds/linux-x64/node.napi1.node");
|
38325
38325
|
} catch (e) {
|
38326
38326
|
module.exports = __nccwpck_require__(6982);
|
38327
38327
|
}
|
@@ -61224,6 +61224,7 @@ const { XflHelpers } = __nccwpck_require__(3972);
|
|
61224
61224
|
const { EvernodeHelpers } = __nccwpck_require__(6384);
|
61225
61225
|
const { StateHelpers } = __nccwpck_require__(3390);
|
61226
61226
|
const { TransactionHelper } = __nccwpck_require__(5358);
|
61227
|
+
const { UtilHelpers } = __nccwpck_require__(3726);
|
61227
61228
|
|
61228
61229
|
const OFFER_WAIT_TIMEOUT = 60;
|
61229
61230
|
|
@@ -61720,81 +61721,109 @@ class HostClient extends BaseEvernodeClient {
|
|
61720
61721
|
* @param {string} outboundIPAddress Assigned IP Address.
|
61721
61722
|
*/
|
61722
61723
|
async offerLease(leaseIndex, leaseAmount, tosHash, outboundIPAddress = null, options = {}) {
|
61724
|
+
const leases = await this.getLeases();
|
61725
|
+
const decoded = (leases ?? []).map((l) => {
|
61726
|
+
return {
|
61727
|
+
token: l,
|
61728
|
+
info: UtilHelpers.decodeLeaseTokenUri(l.URI)
|
61729
|
+
}
|
61730
|
+
});
|
61731
|
+
let existing = decoded.find(l => l.info.leaseIndex == leaseIndex);
|
61732
|
+
|
61733
|
+
let uriToken;
|
61734
|
+
if (!existing) {
|
61735
|
+
// <prefix><version tag ("LTV"+uint8)><lease index (uint16)><half of tos hash><lease amount (int64)><identifier (uint32)><ip data>
|
61736
|
+
// Lengths of sub sections.
|
61737
|
+
const prefixLen = EvernodeConstants.LEASE_TOKEN_PREFIX_HEX.length / 2;
|
61738
|
+
const versionPrefixLen = EvernodeConstants.LEASE_TOKEN_VERSION_PREFIX_HEX.length / 2;
|
61739
|
+
const versionLen = versionPrefixLen + 2; // ("LTV"<Version Number>)
|
61740
|
+
const indexLen = 2;
|
61741
|
+
const halfToSLen = tosHash.length / 4;
|
61742
|
+
const leaseAmountLen = 8;
|
61743
|
+
const identifierLen = 4;
|
61744
|
+
const ipDataLen = 17;
|
61745
|
+
|
61746
|
+
// Offsets of sub sections
|
61747
|
+
const versionPrefixOffset = prefixLen;
|
61748
|
+
const versionOffset = prefixLen + versionPrefixLen;
|
61749
|
+
const indexOffset = prefixLen + versionLen;
|
61750
|
+
const halfTosHashOffset = prefixLen + versionLen + indexLen;
|
61751
|
+
const leaseAmountOffset = prefixLen + versionLen + indexLen + halfToSLen;
|
61752
|
+
const identifierOffset = prefixLen + versionLen + indexLen + halfToSLen + leaseAmountLen;
|
61753
|
+
const ipDataOffset = prefixLen + versionLen + indexLen + halfToSLen + leaseAmountLen + identifierLen;
|
61754
|
+
|
61755
|
+
const uriBuf = Buffer.alloc((prefixLen + versionLen + indexLen + halfToSLen + leaseAmountLen + identifierLen + ipDataLen));
|
61756
|
+
|
61757
|
+
Buffer.from(EvernodeConstants.LEASE_TOKEN_PREFIX_HEX, 'hex').copy(uriBuf);
|
61758
|
+
Buffer.from(EvernodeConstants.LEASE_TOKEN_VERSION_PREFIX_HEX, 'hex').copy(uriBuf, versionPrefixOffset, 0, versionPrefixLen);
|
61759
|
+
uriBuf.writeUInt16BE(EvernodeConstants.LEASE_TOKEN_VERSION, versionOffset);
|
61760
|
+
uriBuf.writeUInt16BE(leaseIndex, indexOffset);
|
61761
|
+
Buffer.from(tosHash, 'hex').copy(uriBuf, halfTosHashOffset, 0, halfToSLen);
|
61762
|
+
uriBuf.writeBigInt64BE(XflHelpers.getXfl(leaseAmount.toString()), leaseAmountOffset);
|
61763
|
+
uriBuf.writeUInt32BE((await this.xrplAcc.getSequence()), identifierOffset);
|
61764
|
+
|
61765
|
+
if (outboundIPAddress) {
|
61766
|
+
if (outboundIPAddress.includes(":")) {
|
61767
|
+
uriBuf.writeUInt8(IPV6_FAMILY, ipDataOffset);
|
61768
|
+
const ipBuf = Buffer.from(outboundIPAddress.split(':').map(v => {
|
61769
|
+
const bytes = [];
|
61770
|
+
for (let i = 0; i < v.length; i += 2) {
|
61771
|
+
bytes.push(parseInt(v.substr(i, 2), 16));
|
61772
|
+
}
|
61773
|
+
return bytes;
|
61774
|
+
}).flat());
|
61723
61775
|
|
61724
|
-
|
61725
|
-
|
61726
|
-
|
61727
|
-
|
61728
|
-
|
61729
|
-
const indexLen = 2;
|
61730
|
-
const halfToSLen = tosHash.length / 4;
|
61731
|
-
const leaseAmountLen = 8;
|
61732
|
-
const identifierLen = 4;
|
61733
|
-
const ipDataLen = 17;
|
61734
|
-
|
61735
|
-
// Offsets of sub sections
|
61736
|
-
const versionPrefixOffset = prefixLen;
|
61737
|
-
const versionOffset = prefixLen + versionPrefixLen;
|
61738
|
-
const indexOffset = prefixLen + versionLen;
|
61739
|
-
const halfTosHashOffset = prefixLen + versionLen + indexLen;
|
61740
|
-
const leaseAmountOffset = prefixLen + versionLen + indexLen + halfToSLen;
|
61741
|
-
const identifierOffset = prefixLen + versionLen + indexLen + halfToSLen + leaseAmountLen;
|
61742
|
-
const ipDataOffset = prefixLen + versionLen + indexLen + halfToSLen + leaseAmountLen + identifierLen;
|
61743
|
-
|
61744
|
-
const uriBuf = Buffer.alloc((prefixLen + versionLen + indexLen + halfToSLen + leaseAmountLen + identifierLen + ipDataLen));
|
61776
|
+
ipBuf.copy(uriBuf, ipDataOffset + 1, 0, ipDataLen);
|
61777
|
+
} else {
|
61778
|
+
throw "Invalid outbound IP address was provided";
|
61779
|
+
}
|
61780
|
+
}
|
61745
61781
|
|
61746
|
-
|
61747
|
-
Buffer.from(EvernodeConstants.LEASE_TOKEN_VERSION_PREFIX_HEX, 'hex').copy(uriBuf, versionPrefixOffset, 0, versionPrefixLen);
|
61748
|
-
uriBuf.writeUInt16BE(EvernodeConstants.LEASE_TOKEN_VERSION, versionOffset);
|
61749
|
-
uriBuf.writeUInt16BE(leaseIndex, indexOffset);
|
61750
|
-
Buffer.from(tosHash, 'hex').copy(uriBuf, halfTosHashOffset, 0, halfToSLen);
|
61751
|
-
uriBuf.writeBigInt64BE(XflHelpers.getXfl(leaseAmount.toString()), leaseAmountOffset);
|
61752
|
-
uriBuf.writeUInt32BE((await this.xrplAcc.getSequence()), identifierOffset);
|
61782
|
+
const uri = uriBuf.toString('base64');
|
61753
61783
|
|
61754
|
-
|
61755
|
-
|
61756
|
-
|
61757
|
-
|
61758
|
-
|
61759
|
-
|
61760
|
-
|
61761
|
-
|
61762
|
-
|
61763
|
-
|
61784
|
+
try {
|
61785
|
+
await this.#submitWithRetry(async (feeUplift, submissionRef) => {
|
61786
|
+
await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false }, { maxLedgerIndex: this.#getMaxLedgerSequence(), feeUplift: feeUplift, submissionRef: submissionRef });
|
61787
|
+
}, { ...(options.retryOptions ? options.retryOptions : {}), submissionRef: options.submissionRef });
|
61788
|
+
} catch (e) {
|
61789
|
+
// Re-minting the URIToken after burning that sold URIToken.
|
61790
|
+
if (e.code === "tecDUPLICATE") {
|
61791
|
+
const uriTokenId = this.xrplAcc.generateIssuedURITokenId(uri);
|
61792
|
+
console.log(`Burning URIToken related to a previously sold lease.`);
|
61793
|
+
await this.xrplAcc.burnURIToken(uriTokenId, { maxLedgerIndex: this.#getMaxLedgerSequence() });
|
61794
|
+
console.log("Re-mint the URIToken for the new lease offer.")
|
61795
|
+
await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false }, { maxLedgerIndex: this.#getMaxLedgerSequence() });
|
61796
|
+
}
|
61797
|
+
}
|
61764
61798
|
|
61765
|
-
|
61766
|
-
|
61767
|
-
|
61799
|
+
uriToken = await this.xrplAcc.getURITokenByUri(uri);
|
61800
|
+
// If uri token is not found in first try, Retry again.
|
61801
|
+
if (!uriToken) {
|
61802
|
+
console.log(`URI token not found, Retrying in 1 second.`)
|
61803
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
61804
|
+
uriToken = await this.xrplAcc.getURITokenByUri(uri);
|
61768
61805
|
}
|
61769
61806
|
}
|
61807
|
+
else {
|
61808
|
+
uriToken = existing.token;
|
61809
|
+
console.log(`Found exiting lease for index ${leaseIndex}. Minting skipped.`);
|
61810
|
+
}
|
61770
61811
|
|
61771
|
-
|
61812
|
+
// Throw if still not found.
|
61813
|
+
if (!uriToken)
|
61814
|
+
throw "Offer lease URI token not found.";
|
61772
61815
|
|
61773
|
-
|
61816
|
+
if (!uriToken.Amount) {
|
61774
61817
|
await this.#submitWithRetry(async (feeUplift, submissionRef) => {
|
61775
|
-
await this.xrplAcc.
|
61818
|
+
await this.xrplAcc.sellURIToken(uriToken.index,
|
61819
|
+
leaseAmount.toString(),
|
61820
|
+
EvernodeConstants.EVR,
|
61821
|
+
this.config.evrIssuerAddress, null, null, { maxLedgerIndex: this.#getMaxLedgerSequence(), feeUplift: feeUplift, submissionRef: submissionRef });
|
61776
61822
|
}, { ...(options.retryOptions ? options.retryOptions : {}), submissionRef: options.submissionRef });
|
61777
|
-
} catch (e) {
|
61778
|
-
// Re-minting the URIToken after burning that sold URIToken.
|
61779
|
-
if (e.code === "tecDUPLICATE") {
|
61780
|
-
const uriTokenId = this.xrplAcc.generateIssuedURITokenId(uri);
|
61781
|
-
console.log(`Burning URIToken related to a previously sold lease.`);
|
61782
|
-
await this.xrplAcc.burnURIToken(uriTokenId, { maxLedgerIndex: this.#getMaxLedgerSequence() });
|
61783
|
-
console.log("Re-mint the URIToken for the new lease offer.")
|
61784
|
-
await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false }, { maxLedgerIndex: this.#getMaxLedgerSequence() });
|
61785
|
-
}
|
61786
61823
|
}
|
61787
|
-
|
61788
|
-
|
61789
|
-
|
61790
|
-
throw "Offer lease NFT creation error.";
|
61791
|
-
|
61792
|
-
await this.#submitWithRetry(async (feeUplift, submissionRef) => {
|
61793
|
-
await this.xrplAcc.sellURIToken(uriToken.index,
|
61794
|
-
leaseAmount.toString(),
|
61795
|
-
EvernodeConstants.EVR,
|
61796
|
-
this.config.evrIssuerAddress, null, null, { maxLedgerIndex: this.#getMaxLedgerSequence(), feeUplift: feeUplift, submissionRef: submissionRef });
|
61797
|
-
}, { ...(options.retryOptions ? options.retryOptions : {}), submissionRef: options.submissionRef });
|
61824
|
+
else {
|
61825
|
+
console.log(`Found exiting offer for the lease ${uriToken.uriTokenId}. Offer skipped.`);
|
61826
|
+
}
|
61798
61827
|
}
|
61799
61828
|
|
61800
61829
|
/**
|
@@ -61889,9 +61918,15 @@ class HostClient extends BaseEvernodeClient {
|
|
61889
61918
|
* @param {string} uriTokenId Hex URI token id of the lease.
|
61890
61919
|
*/
|
61891
61920
|
async expireLease(uriTokenId, options = {}) {
|
61892
|
-
await this
|
61893
|
-
|
61894
|
-
|
61921
|
+
const uriToken = await this.xrplApi.getURITokenByIndex(uriTokenId);
|
61922
|
+
if (uriToken) {
|
61923
|
+
await this.#submitWithRetry(async (feeUplift, submissionRef) => {
|
61924
|
+
await this.xrplAcc.burnURIToken(uriTokenId, { maxLedgerIndex: this.#getMaxLedgerSequence(), feeUplift: feeUplift, submissionRef: submissionRef });
|
61925
|
+
}, { ...(options.retryOptions ? options.retryOptions : {}), submissionRef: options.submissionRef });
|
61926
|
+
}
|
61927
|
+
else {
|
61928
|
+
console.log(`Uri token ${uriTokenId} not found or already burned. Burn skipped.`);
|
61929
|
+
}
|
61895
61930
|
}
|
61896
61931
|
|
61897
61932
|
/**
|
@@ -65660,23 +65695,18 @@ class XrplAccount {
|
|
65660
65695
|
}
|
65661
65696
|
|
65662
65697
|
async getURITokenByUri(uri, isHexUri = false) {
|
65663
|
-
const
|
65664
|
-
|
65665
|
-
return tokens.find(t => t.URI == hexUri);
|
65698
|
+
const index = this.generateIssuedURITokenId(uri, isHexUri);
|
65699
|
+
return await this.xrplApi.getURITokenByIndex(index);
|
65666
65700
|
}
|
65667
65701
|
|
65668
65702
|
|
65669
|
-
generateIssuedURITokenId(uri) {
|
65703
|
+
generateIssuedURITokenId(uri, isHexUri = false) {
|
65670
65704
|
if (uri.length < 1 || uri.length > 256)
|
65671
65705
|
throw 'Invalid URI';
|
65672
65706
|
|
65673
65707
|
const URITOKEN_LEDGER_TYPE_PREFIX = 85; // Decimal value of ASCII 'U'
|
65674
65708
|
const accIdHex = (codec.decodeAccountID(this.address)).toString('hex').toUpperCase();
|
65675
|
-
|
65676
|
-
for (let n in uri) {
|
65677
|
-
let digit = uri.charCodeAt(n).toString(16).toUpperCase();
|
65678
|
-
uriHex += (digit.length == 1 ? '0' : '') + digit
|
65679
|
-
}
|
65709
|
+
const uriHex = isHexUri ? uri : TransactionHelper.asciiToHex(uri).toUpperCase();
|
65680
65710
|
|
65681
65711
|
let hash = crypto.createHash('sha512');
|
65682
65712
|
|
@@ -66307,6 +66337,13 @@ class XrplApi {
|
|
66307
66337
|
}
|
66308
66338
|
}
|
66309
66339
|
|
66340
|
+
async getURITokenByIndex(index) {
|
66341
|
+
const entry = await this.getLedgerEntry(index);
|
66342
|
+
if (!entry || entry.LedgerEntryType !== 'URIToken')
|
66343
|
+
return null;
|
66344
|
+
return entry;
|
66345
|
+
}
|
66346
|
+
|
66310
66347
|
async getTxnInfo(txnHash, options) {
|
66311
66348
|
const resp = (await this.#handleClientRequest({ command: 'tx', transaction: txnHash, binary: false, ...options }));
|
66312
66349
|
return resp?.result;
|
package/package.json
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
],
|
7
7
|
"homepage": "https://github.com/HotPocketDev/evernode-js-client",
|
8
8
|
"license": "SEE LICENSE IN https://raw.githubusercontent.com/EvernodeXRPL/evernode-resources/main/license/evernode-license.pdf",
|
9
|
-
"version": "0.6.
|
9
|
+
"version": "0.6.54",
|
10
10
|
"dependencies": {
|
11
11
|
"elliptic": "6.5.4",
|
12
12
|
"libsodium-wrappers": "0.7.10",
|
Binary file
|
Binary file
|