evernode-js-client 0.5.17-beta-v3.1 → 0.5.17-beta-v3.3
Sign up to get free protection for your applications and to get access to all the features.
- package/index.js +61 -4
- package/package.json +1 -1
package/index.js
CHANGED
@@ -12525,6 +12525,8 @@ class BaseEvernodeClient {
|
|
12525
12525
|
const ownerStateDecoded = StateHelpers.decodeCandidateOwnerState(Buffer.from(ownerStateKey, 'hex'), Buffer.from(ownerStateData, 'hex'));
|
12526
12526
|
return { ...ownerStateDecoded, ...idStateDecoded };
|
12527
12527
|
}
|
12528
|
+
|
12529
|
+
return { ...idStateDecoded, uniqueId: candidateId };
|
12528
12530
|
}
|
12529
12531
|
}
|
12530
12532
|
catch (e) {
|
@@ -13100,7 +13102,20 @@ class HostClient extends BaseEvernodeClient {
|
|
13100
13102
|
Buffer.from(tosHash, 'hex').copy(uriBuf, prefixLen + 2, 0, halfToSLen);
|
13101
13103
|
uriBuf.writeBigInt64BE(XflHelpers.getXfl(leaseAmount.toString()), prefixLen + 2 + halfToSLen);
|
13102
13104
|
const uri = uriBuf.toString('base64');
|
13103
|
-
|
13105
|
+
|
13106
|
+
try {
|
13107
|
+
await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false });
|
13108
|
+
} catch (e) {
|
13109
|
+
// Re-minting the URIToken after burning that sold URIToken.
|
13110
|
+
if (e.code === "tecDUPLICATE") {
|
13111
|
+
const uriTokenId = this.xrplAcc.generateIssuedURITokenId(uri);
|
13112
|
+
console.log(`Burning URIToken related to a previously sold lease.`);
|
13113
|
+
await this.xrplAcc.burnURIToken(uriTokenId);
|
13114
|
+
console.log("Re-mint the URIToken for the new lease offer.")
|
13115
|
+
await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false });
|
13116
|
+
}
|
13117
|
+
}
|
13118
|
+
|
13104
13119
|
const uriToken = await this.xrplAcc.getURITokenByUri(uri);
|
13105
13120
|
if (!uriToken)
|
13106
13121
|
throw "Offer lease NFT creation error.";
|
@@ -13146,6 +13161,15 @@ class HostClient extends BaseEvernodeClient {
|
|
13146
13161
|
if (await this.isRegistered())
|
13147
13162
|
throw "Host already registered.";
|
13148
13163
|
|
13164
|
+
// Check whether are there lease offers in for the host due to a previous registration.
|
13165
|
+
const existingLeaseURITokens = (await this.xrplAcc.getURITokens()).filter(n => EvernodeHelpers.isValidURI(n.URI, EvernodeConstants.LEASE_TOKEN_PREFIX_HEX));
|
13166
|
+
if (existingLeaseURITokens) {
|
13167
|
+
console.log("Burning unsold URITokens related to the previous leases.");
|
13168
|
+
for (const uriToken of existingLeaseURITokens) {
|
13169
|
+
await this.xrplAcc.burnURIToken(uriToken.index);
|
13170
|
+
}
|
13171
|
+
}
|
13172
|
+
|
13149
13173
|
// Check whether is there any missed NFT sell offer that needs to be accepted
|
13150
13174
|
// from the client-side in order to complete the registration.
|
13151
13175
|
const registryAcc = new XrplAccount(this.config.registryAddress, null, { xrplApi: this.xrplApi });
|
@@ -14931,6 +14955,7 @@ const EPOCH_COUNT_OFFSET = 0;
|
|
14931
14955
|
const FIRST_EPOCH_REWARD_QUOTA_OFFSET = 1;
|
14932
14956
|
const EPOCH_REWARD_AMOUNT_OFFSET = 5;
|
14933
14957
|
const REWARD_START_MOMENT_OFFSET = 9;
|
14958
|
+
const ACCUMULATED_REWARD_FREQUENCY_OFFSET = 13;
|
14934
14959
|
|
14935
14960
|
const TRANSIT_IDX_OFFSET = 0;
|
14936
14961
|
const TRANSIT_MOMENT_SIZE_OFFSET = 8;
|
@@ -14980,6 +15005,7 @@ const HOST_CPU_MICROSEC_OFFSET = 64;
|
|
14980
15005
|
const HOST_RAM_MB_OFFSET = 68;
|
14981
15006
|
const HOST_DISK_MB_OFFSET = 72;
|
14982
15007
|
const HOST_EMAIL_ADDRESS_OFFSET = 76;
|
15008
|
+
const HOST_ACCUMULATED_REWARD_OFFSET = 116;
|
14983
15009
|
|
14984
15010
|
const PREV_HOST_ADDRESS_OFFSET = 0;
|
14985
15011
|
const TRANSFER_LEDGER_IDX_OFFSET = 20;
|
@@ -15080,7 +15106,8 @@ class StateHelpers {
|
|
15080
15106
|
cpuMicrosec: stateDataBuf.readUInt32BE(HOST_CPU_MICROSEC_OFFSET),
|
15081
15107
|
ramMb: stateDataBuf.readUInt32BE(HOST_RAM_MB_OFFSET),
|
15082
15108
|
diskMb: stateDataBuf.readUInt32BE(HOST_DISK_MB_OFFSET),
|
15083
|
-
email: stateDataBuf.slice(HOST_EMAIL_ADDRESS_OFFSET, HOST_EMAIL_ADDRESS_OFFSET + HOST_EMAIL_ADDRESS_LEN).toString().toString().replace(/\0/g, '')
|
15109
|
+
email: stateDataBuf.slice(HOST_EMAIL_ADDRESS_OFFSET, HOST_EMAIL_ADDRESS_OFFSET + HOST_EMAIL_ADDRESS_LEN).toString().toString().replace(/\0/g, ''),
|
15110
|
+
accumulatedRewardAmount: XflHelpers.toString(stateDataBuf.readBigInt64BE(HOST_ACCUMULATED_REWARD_OFFSET))
|
15084
15111
|
}
|
15085
15112
|
}
|
15086
15113
|
|
@@ -15250,7 +15277,8 @@ class StateHelpers {
|
|
15250
15277
|
epochCount: stateData.readUInt8(EPOCH_COUNT_OFFSET),
|
15251
15278
|
firstEpochRewardQuota: stateData.readUInt32BE(FIRST_EPOCH_REWARD_QUOTA_OFFSET),
|
15252
15279
|
epochRewardAmount: stateData.readUInt32BE(EPOCH_REWARD_AMOUNT_OFFSET),
|
15253
|
-
rewardStartMoment: stateData.readUInt32BE(REWARD_START_MOMENT_OFFSET)
|
15280
|
+
rewardStartMoment: stateData.readUInt32BE(REWARD_START_MOMENT_OFFSET),
|
15281
|
+
accumulatedRewardFrequency: stateData.readUInt16BE(ACCUMULATED_REWARD_FREQUENCY_OFFSET)
|
15254
15282
|
}
|
15255
15283
|
}
|
15256
15284
|
}
|
@@ -15331,7 +15359,7 @@ class StateHelpers {
|
|
15331
15359
|
voteBaseCountChangedTimestamp: Number(stateData.readBigUInt64BE(VOTER_BASE_COUNT_CHANGED_TIMESTAMP_OFFSET)),
|
15332
15360
|
foundationLastVotedCandidateIdx: stateData.readUInt32BE(FOUNDATION_LAST_VOTED_CANDIDATE_IDX),
|
15333
15361
|
foundationLastVotedTimestamp: Number(stateData.readBigUInt64BE(FOUNDATION_LAST_VOTED_TIMESTAMP_OFFSET)),
|
15334
|
-
electedProposalUniqueId: stateData.
|
15362
|
+
electedProposalUniqueId: stateData.slice(ELECTED_PROPOSAL_UNIQUE_ID_OFFSET, PROPOSAL_ELECTED_TIMESTAMP_OFFSET).toString('hex').toUpperCase(),
|
15335
15363
|
proposalElectedTimestamp: Number(stateData.readBigUInt64BE(PROPOSAL_ELECTED_TIMESTAMP_OFFSET)),
|
15336
15364
|
updatedHookCount: stateData.readUInt8(UPDATED_HOOK_COUNT_OFFSET),
|
15337
15365
|
supportVoteSent: stateData.readUInt8(FOUNDATION_SUPPORT_VOTE_FLAG_OFFSET)
|
@@ -16437,6 +16465,35 @@ class XrplAccount {
|
|
16437
16465
|
const hexUri = isHexUri ? uri : TransactionHelper.asciiToHex(uri).toUpperCase();
|
16438
16466
|
return tokens.find(t => t.URI == hexUri);
|
16439
16467
|
}
|
16468
|
+
|
16469
|
+
|
16470
|
+
generateIssuedURITokenId(uri) {
|
16471
|
+
if (uri.length < 1 || uri.length > 256)
|
16472
|
+
throw 'Invalid URI';
|
16473
|
+
|
16474
|
+
const URITOKEN_LEDGER_TYPE_PREFIX = 85; // Decimal value of ASCII 'U'
|
16475
|
+
const accIdHex = (codec.decodeAccountID(this.address)).toString('hex').toUpperCase();
|
16476
|
+
let uriHex = '';
|
16477
|
+
for (let n in uri) {
|
16478
|
+
let digit = uri.charCodeAt(n).toString(16).toUpperCase();
|
16479
|
+
uriHex += (digit.length == 1 ? '0' : '') + digit
|
16480
|
+
}
|
16481
|
+
|
16482
|
+
let hash = crypto.createHash('sha512');
|
16483
|
+
|
16484
|
+
const typeBuf = Buffer.allocUnsafe(2);
|
16485
|
+
typeBuf.writeInt16BE(URITOKEN_LEDGER_TYPE_PREFIX);
|
16486
|
+
|
16487
|
+
const dataBuf = Buffer.from(`${accIdHex}${uriHex}`, 'hex');
|
16488
|
+
|
16489
|
+
let output = hash.update(typeBuf);
|
16490
|
+
output = hash.update(dataBuf);
|
16491
|
+
|
16492
|
+
const digest = output.digest('hex');
|
16493
|
+
|
16494
|
+
// Get the first 32 bytes of hash.
|
16495
|
+
return digest.substring(0, 64).toUpperCase();
|
16496
|
+
}
|
16440
16497
|
}
|
16441
16498
|
|
16442
16499
|
function makeAmountObject(amount, currency, issuer) {
|
package/package.json
CHANGED