evernode-js-client 0.4.15 → 0.4.18
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 +62 -52
- package/package.json +1 -1
package/index.js
CHANGED
@@ -11,8 +11,6 @@ const { EvernodeEvents, MemoTypes, MemoFormats, EvernodeConstants, HookStateKeys
|
|
11
11
|
const { DefaultValues } = __nccwpck_require__(262);
|
12
12
|
const { EncryptionHelper } = __nccwpck_require__(832);
|
13
13
|
const { EventEmitter } = __nccwpck_require__(170);
|
14
|
-
const codec = __nccwpck_require__(597);
|
15
|
-
const { Buffer } = __nccwpck_require__(300);
|
16
14
|
const { UtilHelpers } = __nccwpck_require__(687);
|
17
15
|
const { FirestoreHandler } = __nccwpck_require__(718);
|
18
16
|
|
@@ -133,10 +131,15 @@ class BaseEvernodeClient {
|
|
133
131
|
hostRegFee: UtilHelpers.getStateData(states, HookStateKeys.HOST_REG_FEE),
|
134
132
|
momentSize: UtilHelpers.getStateData(states, HookStateKeys.MOMENT_SIZE),
|
135
133
|
hostHeartbeatFreq: UtilHelpers.getStateData(states, HookStateKeys.HOST_HEARTBEAT_FREQ),
|
136
|
-
momentBaseIdx: UtilHelpers.getStateData(states, HookStateKeys.MOMENT_BASE_IDX)
|
134
|
+
momentBaseIdx: UtilHelpers.getStateData(states, HookStateKeys.MOMENT_BASE_IDX),
|
135
|
+
purchaserTargetPrice: UtilHelpers.getStateData(states, HookStateKeys.PURCHASER_TARGET_PRICE)
|
137
136
|
};
|
138
137
|
}
|
139
138
|
|
139
|
+
async refreshConfig() {
|
140
|
+
this.config = await this.#getEvernodeConfig();
|
141
|
+
}
|
142
|
+
|
140
143
|
async #handleEvernodeEvent(tx, error) {
|
141
144
|
if (error)
|
142
145
|
console.error(error);
|
@@ -179,37 +182,16 @@ class BaseEvernodeClient {
|
|
179
182
|
console.log('Failed to decrypt redeem data.');
|
180
183
|
}
|
181
184
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
redeemRefId: buf.slice(31, 63).toString('hex'),
|
193
|
-
user: codec.encodeAccountID(buf.slice(0, 20)),
|
194
|
-
host: tx.Destination,
|
195
|
-
token: buf.slice(28, 31).toString(),
|
196
|
-
moments: parseInt(buf.slice(20, 28).readBigInt64BE(0)),
|
197
|
-
payload: payload
|
198
|
-
}
|
199
|
-
}
|
200
|
-
}
|
201
|
-
else {
|
202
|
-
return {
|
203
|
-
name: EvernodeEvents.Redeem,
|
204
|
-
data: {
|
205
|
-
transaction: tx,
|
206
|
-
redeemRefId: tx.Hash,
|
207
|
-
user: tx.Account,
|
208
|
-
host: tx.Amount.issuer,
|
209
|
-
token: tx.Amount.currency,
|
210
|
-
moments: parseInt(tx.Amount.value),
|
211
|
-
payload: payload
|
212
|
-
}
|
185
|
+
return {
|
186
|
+
name: EvernodeEvents.Redeem,
|
187
|
+
data: {
|
188
|
+
transaction: tx,
|
189
|
+
redeemRefId: tx.hash,
|
190
|
+
user: tx.Account,
|
191
|
+
host: tx.Amount.issuer,
|
192
|
+
token: tx.Amount.currency,
|
193
|
+
moments: parseInt(tx.Amount.value),
|
194
|
+
payload: payload
|
213
195
|
}
|
214
196
|
}
|
215
197
|
}
|
@@ -418,6 +400,22 @@ class HostClient extends BaseEvernodeClient {
|
|
418
400
|
if (await this.isRegistered())
|
419
401
|
throw "Host already registered.";
|
420
402
|
|
403
|
+
// Check whether is there any missed NFT sell offer that needs to be accepted
|
404
|
+
// from the client-side in order to complete the registration.
|
405
|
+
const regNft = await this.getRegistrationNft();
|
406
|
+
if (!regNft) {
|
407
|
+
const regInfo = await this.getHosts({ address: this.xrplAcc.address });
|
408
|
+
if (regInfo.length !== 0) {
|
409
|
+
const registryAcc = new XrplAccount(this.registryAddress, null, { xrplApi: this.xrplApi });
|
410
|
+
const sellOffer = (await registryAcc.getNftOffers()).find(o => o.TokenID == regInfo[0].nfTokenId);
|
411
|
+
if (sellOffer) {
|
412
|
+
await this.xrplAcc.buyNft(sellOffer.index);
|
413
|
+
console.log("Registration was successfully completed after acquiring the NFT.");
|
414
|
+
return await this.isRegistered();
|
415
|
+
}
|
416
|
+
}
|
417
|
+
}
|
418
|
+
|
421
419
|
const memoData = `${hostingToken};${countryCode};${cpuMicroSec};${ramMb};${diskMb};${totalInstanceCount};${description}`
|
422
420
|
const tx = await this.xrplAcc.makePayment(this.registryAddress,
|
423
421
|
this.config.hostRegFee.toString(),
|
@@ -453,8 +451,10 @@ class HostClient extends BaseEvernodeClient {
|
|
453
451
|
const nft = (await registryAcc.getNfts()).find(n => n.URI === `${EvernodeConstants.NFT_PREFIX_HEX}${tx.id}`);
|
454
452
|
if (nft) {
|
455
453
|
const sellOffer = (await registryAcc.getNftOffers()).find(o => o.TokenID === nft.TokenID && o.Flags === 1);
|
456
|
-
|
457
|
-
|
454
|
+
if (sellOffer) {
|
455
|
+
await this.xrplAcc.buyNft(sellOffer.index);
|
456
|
+
tx.isSellOfferAccepted = true;
|
457
|
+
}
|
458
458
|
}
|
459
459
|
}
|
460
460
|
}
|
@@ -473,7 +473,7 @@ class HostClient extends BaseEvernodeClient {
|
|
473
473
|
options.transactionOptions);
|
474
474
|
|
475
475
|
console.log('Waiting for the buy offer')
|
476
|
-
const regAcc = new XrplAccount(this.registryAddress);
|
476
|
+
const regAcc = new XrplAccount(this.registryAddress, null, { xrplApi: this.xrplApi });
|
477
477
|
let offer = null;
|
478
478
|
let attempts = 0;
|
479
479
|
while (attempts < OFFER_WAIT_TIMEOUT) {
|
@@ -492,6 +492,15 @@ class HostClient extends BaseEvernodeClient {
|
|
492
492
|
return await this.isRegistered();
|
493
493
|
}
|
494
494
|
|
495
|
+
async heartbeat(options = {}) {
|
496
|
+
return this.xrplAcc.makePayment(this.registryAddress,
|
497
|
+
XrplConstants.MIN_XRP_AMOUNT,
|
498
|
+
XrplConstants.XRP,
|
499
|
+
null,
|
500
|
+
[{ type: MemoTypes.HEARTBEAT, format: "", data: "" }],
|
501
|
+
options.transactionOptions);
|
502
|
+
}
|
503
|
+
|
495
504
|
async redeemSuccess(txHash, userAddress, instanceInfo, options = {}) {
|
496
505
|
|
497
506
|
// Encrypt the instance info with the user's encryption key (Specified in MessageKey field of the user account).
|
@@ -505,7 +514,7 @@ class HostClient extends BaseEvernodeClient {
|
|
505
514
|
{ type: MemoTypes.REDEEM_SUCCESS, format: MemoFormats.BASE64, data: encrypted },
|
506
515
|
{ type: MemoTypes.REDEEM_REF, format: MemoFormats.HEX, data: txHash }];
|
507
516
|
|
508
|
-
return this.xrplAcc.makePayment(
|
517
|
+
return this.xrplAcc.makePayment(userAddress,
|
509
518
|
XrplConstants.MIN_XRP_AMOUNT,
|
510
519
|
XrplConstants.XRP,
|
511
520
|
null,
|
@@ -513,29 +522,19 @@ class HostClient extends BaseEvernodeClient {
|
|
513
522
|
options.transactionOptions);
|
514
523
|
}
|
515
524
|
|
516
|
-
async redeemError(txHash, reason, options = {}) {
|
525
|
+
async redeemError(txHash, userAddress, reason, options = {}) {
|
517
526
|
|
518
527
|
const memos = [
|
519
528
|
{ type: MemoTypes.REDEEM_ERROR, format: MemoFormats.JSON, data: { type: ErrorCodes.REDEEM_ERR, reason: reason } },
|
520
529
|
{ type: MemoTypes.REDEEM_REF, format: MemoFormats.HEX, data: txHash }];
|
521
530
|
|
522
|
-
return this.xrplAcc.makePayment(
|
531
|
+
return this.xrplAcc.makePayment(userAddress,
|
523
532
|
XrplConstants.MIN_XRP_AMOUNT,
|
524
533
|
XrplConstants.XRP,
|
525
534
|
null,
|
526
535
|
memos,
|
527
536
|
options.transactionOptions);
|
528
537
|
}
|
529
|
-
|
530
|
-
async heartbeat(options = {}) {
|
531
|
-
return this.xrplAcc.makePayment(this.registryAddress,
|
532
|
-
XrplConstants.MIN_XRP_AMOUNT,
|
533
|
-
XrplConstants.XRP,
|
534
|
-
null,
|
535
|
-
this.xrplAcc.address,
|
536
|
-
[{ type: MemoTypes.HEARTBEAT, format: "", data: "" }],
|
537
|
-
options.transactionOptions);
|
538
|
-
}
|
539
538
|
}
|
540
539
|
|
541
540
|
module.exports = {
|
@@ -1089,7 +1088,6 @@ const EvernodeConstants = {
|
|
1089
1088
|
|
1090
1089
|
const MemoTypes = {
|
1091
1090
|
REDEEM: 'evnRedeem',
|
1092
|
-
REDEEM_ORIGIN: 'evnRedeemOrigin',
|
1093
1091
|
REDEEM_SUCCESS: 'evnRedeemSuccess',
|
1094
1092
|
REDEEM_ERROR: 'evnRedeemError',
|
1095
1093
|
REDEEM_REF: 'evnRedeemRef',
|
@@ -1123,6 +1121,7 @@ const HookStateKeys = {
|
|
1123
1121
|
MINT_LIMIT: "4556520100000000000000000000000000000000000000000000000000000004",
|
1124
1122
|
FIXED_REG_FEE: "4556520100000000000000000000000000000000000000000000000000000005",
|
1125
1123
|
HOST_HEARTBEAT_FREQ: "4556520100000000000000000000000000000000000000000000000000000006",
|
1124
|
+
PURCHASER_TARGET_PRICE: "4556520100000000000000000000000000000000000000000000000000000007",
|
1126
1125
|
// Singleton
|
1127
1126
|
HOST_COUNT: "4556523200000000000000000000000000000000000000000000000000000000",
|
1128
1127
|
MOMENT_BASE_IDX: "4556523300000000000000000000000000000000000000000000000000000000",
|
@@ -1482,6 +1481,7 @@ module.exports = {
|
|
1482
1481
|
const codec = __nccwpck_require__(597);
|
1483
1482
|
const { Buffer } = __nccwpck_require__(300);
|
1484
1483
|
const { HookStateKeys } = __nccwpck_require__(849);
|
1484
|
+
const { XflHelpers } = __nccwpck_require__(243);
|
1485
1485
|
|
1486
1486
|
const NFTOKEN_PREFIX = '00080000';
|
1487
1487
|
|
@@ -1520,7 +1520,7 @@ class StateHelpers {
|
|
1520
1520
|
registrationFee: Number(stateDataBuf.readBigUInt64BE(HOST_REG_FEE_OFFSET)),
|
1521
1521
|
noOfTotalInstances: stateDataBuf.readUInt32BE(HOST_TOT_INS_COUNT_OFFSET),
|
1522
1522
|
noOfActiveInstances: stateDataBuf.readUInt32BE(HOST_ACT_INS_COUNT_OFFSET),
|
1523
|
-
lastHeartbeatLedger: stateDataBuf.
|
1523
|
+
lastHeartbeatLedger: Number(stateDataBuf.readBigUInt64BE(HOST_HEARTBEAT_LEDGER_IDX_OFFSET))
|
1524
1524
|
}
|
1525
1525
|
}
|
1526
1526
|
|
@@ -1583,6 +1583,15 @@ class StateHelpers {
|
|
1583
1583
|
value: Number(stateData.readBigUInt64BE())
|
1584
1584
|
}
|
1585
1585
|
}
|
1586
|
+
else if (Buffer.from(HookStateKeys.PURCHASER_TARGET_PRICE, 'hex').compare(stateKey) === 0) {
|
1587
|
+
const xfl = stateData.readBigInt64BE(0);
|
1588
|
+
const val = XflHelpers.toString(xfl);
|
1589
|
+
return {
|
1590
|
+
type: this.StateTypes.CONFIGURATION,
|
1591
|
+
key: hexKey,
|
1592
|
+
value: val
|
1593
|
+
}
|
1594
|
+
}
|
1586
1595
|
else
|
1587
1596
|
throw { type: 'Validation Error', message: 'Invalid state key.' };
|
1588
1597
|
}
|
@@ -1613,6 +1622,7 @@ class StateHelpers {
|
|
1613
1622
|
else if (Buffer.from(HookStateKeys.EVR_ISSUER_ADDR, 'hex').compare(stateKey) === 0 ||
|
1614
1623
|
Buffer.from(HookStateKeys.FOUNDATION_ADDR, 'hex').compare(stateKey) === 0 ||
|
1615
1624
|
Buffer.from(HookStateKeys.MOMENT_SIZE, 'hex').compare(stateKey) === 0 ||
|
1625
|
+
Buffer.from(HookStateKeys.PURCHASER_TARGET_PRICE, 'hex').compare(stateKey) === 0 ||
|
1616
1626
|
Buffer.from(HookStateKeys.HOST_HEARTBEAT_FREQ, 'hex').compare(stateKey) ||
|
1617
1627
|
Buffer.from(HookStateKeys.MINT_LIMIT, 'hex').compare(stateKey) === 0 ||
|
1618
1628
|
Buffer.from(HookStateKeys.FIXED_REG_FEE, 'hex').compare(stateKey) === 0) {
|