diff --git a/mb-xrpl/lib/appenv.js b/mb-xrpl/lib/appenv.js index b5e2ee1..10c6a30 100644 --- a/mb-xrpl/lib/appenv.js +++ b/mb-xrpl/lib/appenv.js @@ -24,8 +24,9 @@ appenv = { ACQUIRE_LEASE_TIMEOUT_THRESHOLD: 0.8, ACQUIRE_LEASE_WAIT_TIMEOUT_THRESHOLD: 0.4, ORPHAN_PRUNE_SCHEDULER_INTERVAL_HOURS: 4, + EXPIRE_INSTANCES_SCHEDULER_INTERVAL_SECONDS: 2, SASHI_CLI_PATH: appenv.IS_DEV_MODE ? "../build/sashi" : "/usr/bin/sashi", - MB_VERSION: '0.5.12', + MB_VERSION: '0.5.13', TOS_HASH: '757A0237B44D8B2BBB04AE2BAD5813858E0AECD2F0B217075E27E0630BA74314' // This is the sha256 hash of TOS text. } Object.freeze(appenv); diff --git a/mb-xrpl/lib/message-board.js b/mb-xrpl/lib/message-board.js index 53c9ad8..ab7a89b 100644 --- a/mb-xrpl/lib/message-board.js +++ b/mb-xrpl/lib/message-board.js @@ -16,6 +16,12 @@ const LeaseStatus = { class MessageBoard { #leaseUpdateLock = false; // This locking mechanism is temporary, can be removed when acquire queue is implemented + #xrplHalted = false; + #graceThreshold = 0.25; + #haltTimeout = 60; // In seconds + #instanceExpirationQueue = []; + #graceTimeoutRef = null; + #lastHaltedTime = null; constructor(configPath, secretConfigPath, dbPath, sashiCliPath, sashiDbPath) { this.configPath = configPath; @@ -58,7 +64,7 @@ class MessageBoard { throw "Host is not registered."; // Get moment only if heartbeat info is not 0. - this.lastHeartbeatMoment = hostInfo.lastHeartbeatLedger ? await this.hostClient.getMoment(hostInfo.lastHeartbeatLedger) : 0; + this.lastHeartbeatMoment = hostInfo.lastHeartbeatIndex ? await this.hostClient.getMoment(hostInfo.lastHeartbeatIndex) : 0; this.db.open(); // Create lease table if not exist. @@ -69,7 +75,7 @@ class MessageBoard { const leaseRecords = (await this.getLeaseRecords()).filter(r => (r.status === LeaseStatus.ACQUIRED || r.status === LeaseStatus.EXTENDED)); for (const lease of leaseRecords) - this.addToExpiryList(lease.tx_hash, lease.container_name, lease.tenant_xrp_address, this.getExpiryLedger(lease.created_on_ledger, lease.life_moments)); + this.addToExpiryList(lease.tx_hash, lease.container_name, lease.tenant_xrp_address, this.getExpiryTimestamp(lease.timestamp, lease.life_moments)); // Catch up missed transactions based on the previously updated "last_watched_ledger" record (checkpoint). await this.#catchupMissedLeases().catch(console.error); @@ -80,80 +86,147 @@ class MessageBoard { await this.hostClient.updateRegInfo(this.activeInstanceCount, this.cfg.version); this.db.close(); - let ongoingHeartbeat = false; - // Check for instance expiry. this.xrplApi.on(evernode.XrplApiEvents.LEDGER, async (e) => { this.lastValidatedLedgerIndex = e.ledger_index; - - const currentMoment = await this.hostClient.getMoment(e.ledger_index); - - // Sending heartbeat every CONF_HOST_HEARTBEAT_FREQ moments. - if (!ongoingHeartbeat && - (this.lastHeartbeatMoment === 0 || (currentMoment % this.hostClient.config.hostHeartbeatFreq === 0 && currentMoment !== this.lastHeartbeatMoment))) { - ongoingHeartbeat = true; - console.log(`Reporting heartbeat at Moment ${this.lastHeartbeatMoment}...`); - - try { - await this.hostClient.heartbeat(); - this.lastHeartbeatMoment = currentMoment; - } - catch (err) { - if (err.code === 'tecHOOK_REJECTED') - console.log("Heartbeat rejected by the hook."); - else - console.log("Heartbeat tx error", err); - } - finally { - ongoingHeartbeat = false; - } - } - - // Filter out instances which needed to be expired and destroy them. - const expired = this.expiryList.filter(x => x.expiryLedger < e.ledger_index); - if (expired && expired.length) { - this.expiryList = this.expiryList.filter(x => x.expiryLedger >= e.ledger_index); - - this.db.open(); - await this.#acquireLeaseUpdateLock(); - for (const x of expired) { - try { - console.log(`Moments exceeded (current ledger:${e.ledger_index}, expiry ledger:${x.expiryLedger}). Destroying ${x.containerName}`); - // Expire the current lease agreement (Burn the instance NFT) and re-minting and creating sell offer for the same lease index. - const nft = (await (new evernode.XrplAccount(x.tenant)).getNfts())?.find(n => n.NFTokenID == x.containerName); - // If there's no nft for this record it should be already burned and instance is destroyed, So we only delete the record. - if (!nft) - console.log(`Cannot find a NFT for ${x.containerName}`); - else { - const uriInfo = evernode.UtilHelpers.decodeLeaseNftUri(nft.URI); - await this.destroyInstance(x.containerName, x.tenant, uriInfo.leaseIndex); - } - - this.activeInstanceCount--; - /** - * Soft deletion for debugging purpose. - */ - // await this.updateLeaseStatus(x.txHash, LeaseStatus.EXPIRED); - - // Delete the lease record related to this instance (Permanent Delete). - await this.deleteLeaseRecord(x.txHash); - - await this.hostClient.updateRegInfo(this.activeInstanceCount); - console.log(`Destroyed ${x.containerName}`); - } - catch (e) { - console.error(e); - } - } - await this.#releaseLeaseUpdateLock(); - this.db.close(); - } + this.lastLedgerTime = evernode.UtilHelpers.getCurrentUnixTime('milli'); }); this.hostClient.on(evernode.HostEvents.AcquireLease, r => this.handleAcquireLease(r)); this.hostClient.on(evernode.HostEvents.ExtendLease, r => this.handleExtendLease(r)); + + // Start a job to expire instances and check for halts + this.#startSashimonoClockScheduler(); + + // Start heartbeat job + this.#startHeartBeatScheduler(); + // Start a job to prune the orphan instances. this.#startPruneScheduler(); + + } + + // Check for xrpl halts + #checkLedgersForHalt() { + const currentTime = evernode.UtilHelpers.getCurrentUnixTime('milli'); + const lastLedgerTimeDifference = currentTime - this.lastLedgerTime; + + if (lastLedgerTimeDifference >= this.#haltTimeout * 1000) { + if (!this.#xrplHalted) { + this.#xrplHalted = true; + this.#lastHaltedTime = this.lastLedgerTime; + } else if (this.#graceTimeoutRef) { + clearTimeout(this.#graceTimeoutRef); + this.#graceTimeoutRef = null; + } + } + + if (this.#xrplHalted && lastLedgerTimeDifference < (this.#haltTimeout * 1000) && !this.#graceTimeoutRef) { + const haltedDuration = currentTime - this.#lastHaltedTime; // in milliSec + const gracePeriod = haltedDuration * this.#graceThreshold; + this.#graceTimeoutRef = setTimeout(() => { + this.#xrplHalted = false; + this.#graceTimeoutRef = null; + }, gracePeriod); + } + } + + // Expire leases + async #expireInstances() { + const currentTime = evernode.UtilHelpers.getCurrentUnixTime(); + + // Filter out instances which needed to be expired and destroy them. + const expired = this.expiryList.filter(x => x.expiryTimestamp < currentTime); + if (expired && expired.length) { + console.log(`Starting the expiring instances job...`); + this.#instanceExpirationQueue.push(...expired); + this.expiryList = this.expiryList.filter(x => x.expiryTimestamp >= currentTime); + } + + if (!this.#xrplHalted && this.#instanceExpirationQueue.length) { + this.db.open(); + await this.#acquireLeaseUpdateLock(); + for (let item of this.#instanceExpirationQueue) { + try { + if (!this.#xrplHalted) { + await this.#expireInstance(item, currentTime); + // Remove from the queue + this.#instanceExpirationQueue = this.#instanceExpirationQueue.filter(i => i.containerName != item.containerName); + } + else { + console.log("XRPL is halted.") + break; + } + } + catch (e) { + console.log(`Error "${e}", occured in expiring the item : ${item}.`) + } + } + await this.#releaseLeaseUpdateLock(); + this.db.close(); + console.log(`Stopping the expiring instances job...`); + } + } + + // Heartbeat sender + async #sendHeartbeat() { + let ongoingHeartbeat = false; + const currentMoment = await this.hostClient.getMoment(); + + // Sending heartbeat every CONF_HOST_HEARTBEAT_FREQ moments. + if (!ongoingHeartbeat && + (this.lastHeartbeatMoment === 0 || (currentMoment % this.hostClient.config.hostHeartbeatFreq === 0 && currentMoment !== this.lastHeartbeatMoment))) { + ongoingHeartbeat = true; + console.log(`Reporting heartbeat at Moment ${currentMoment}...`); + + try { + await this.hostClient.heartbeat(); + this.lastHeartbeatMoment = currentMoment; + } + catch (err) { + if (err.code === 'tecHOOK_REJECTED') + console.log("Heartbeat rejected by the hook."); + else + console.log("Heartbeat tx error", err); + } + finally { + ongoingHeartbeat = false; + } + } + } + + async #expireInstance(lease, currentTime = evernode.UtilHelpers.getCurrentUnixTime()) { + try { + console.log(`Moments exceeded (current timestamp:${currentTime}, expiry timestamp:${lease.expiryTimestamp}). Destroying ${lease.containerName}`); + // Expire the current lease agreement (Burn the instance NFT) and re-minting and creating sell offer for the same lease index. + const nft = (await (new evernode.XrplAccount(lease.tenant)).getNfts())?.find(n => n.NFTokenID == lease.containerName); + // If there's no nft for this record it should be already burned and instance is destroyed, So we only delete the record. + if (!nft) + console.log(`Cannot find a NFT for ${lease.containerName}`); + else { + const uriInfo = evernode.UtilHelpers.decodeLeaseNftUri(nft.URI); + await this.destroyInstance(lease.containerName, lease.tenant, uriInfo.leaseIndex); + } + + this.activeInstanceCount--; + /** + * Soft deletion for debugging purpose. + */ + // await this.updateLeaseStatus(x.txHash, LeaseStatus.EXPIRED); + + // Delete the lease record related to this instance (Permanent Delete). + await this.deleteLeaseRecord(lease.txHash); + + // Remove from the queue + this.#instanceExpirationQueue = this.#instanceExpirationQueue.filter(i => i.containerName != lease.containerName); + + await this.hostClient.updateRegInfo(this.activeInstanceCount); + console.log(`Destroyed ${lease.containerName}`); + + } + catch (e) { + console.error(e); + } } // Connect the host and trying to reconnect in the event of account not found error. @@ -204,6 +277,41 @@ class MessageBoard { }, timeout); } + #startSashimonoClockScheduler() { + const timeout = appenv.EXPIRE_INSTANCES_SCHEDULER_INTERVAL_SECONDS * 1000; // Seconds to millisecs. + + const scheduler = async () => { + this.#checkLedgersForHalt(); + await this.#expireInstances(); + setTimeout(async () => { + await scheduler(); + }, timeout); + }; + + setTimeout(async () => { + await scheduler(); + }, timeout); + } + + async #startHeartBeatScheduler() { + // Sending a heartbeat at startup + await this.#sendHeartbeat(); + + const timeout = this.hostClient.config.momentSize * 1000; // Seconds to millisecs. + + const scheduler = async () => { + await this.#sendHeartbeat(); + setTimeout(async () => { + await scheduler(); + }, timeout); + }; + + const nextMomentStartIdx = await this.hostClient.getMomentStartIndex() + this.hostClient.config.momentSize; + setTimeout(async () => { + await scheduler(); + }, (nextMomentStartIdx - evernode.UtilHelpers.getCurrentUnixTime()) * 1000); + } + // Try to acquire the lease update lock. async #acquireLeaseUpdateLock() { await new Promise(async resolve => { @@ -228,8 +336,8 @@ class MessageBoard { // Note: If this is soft deletion we need to handle the destroyed status and replace deleteLeaseRecord with changing the status. // Get the records which are created before an acquire timeout x 2. - // Take the xrpl ledger time as 4 seconds. - const timeoutSecs = (this.hostClient.config.leaseAcquireWindow * 4 * appenv.ACQUIRE_LEASE_TIMEOUT_THRESHOLD) * 2; + // leaseAcqureWindow is in seconds. + const timeoutSecs = (this.hostClient.config.leaseAcquireWindow * appenv.ACQUIRE_LEASE_TIMEOUT_THRESHOLD) * 2; const timeMargin = new Date(Date.now() - (1000 * timeoutSecs)); this.sashiDb.open(); @@ -507,17 +615,17 @@ class MessageBoard { await this.createLeaseRecord(acquireRefId, tenantAddress, containerName, moments); // The last validated ledger when we receive the acquire request. - const startingValidatedLedger = this.lastValidatedLedgerIndex; + const startingValidatedTime = evernode.UtilHelpers.getCurrentUnixTime(); // Wait until the sashi cli is available. await this.sashiCli.wait(); // Number of validated ledgers passed while processing the last request. - let diff = this.lastValidatedLedgerIndex - startingValidatedLedger; - // Give-up the acquiring process if processing the last request takes more than 40% of allowed window. + let diff = evernode.UtilHelpers.getCurrentUnixTime() - startingValidatedTime; + // Give-up the acquiring process if processing the last request takes more than 40% of allowed window(Window is in seconds). let threshold = this.hostClient.config.leaseAcquireWindow * appenv.ACQUIRE_LEASE_WAIT_TIMEOUT_THRESHOLD; if (diff > threshold) { - console.error(`Sashimono busy timeout. Took: ${diff} ledgers. Threshold: ${threshold}`); + console.error(`Sashimono busy timeout. Took: ${diff} seconds. Threshold: ${threshold} seconds`); // Update the lease status of the request to 'SashiTimeout'. await this.updateAcquireStatus(acquireRefId, LeaseStatus.SASHI_TIMEOUT); await this.recreateLeaseOffer(nfTokenId, tenantAddress, leaseIndex); @@ -527,11 +635,11 @@ class MessageBoard { createRes = await this.sashiCli.createInstance(containerName, instanceRequirements); // Number of validated ledgers passed while the instance is created. - diff = this.lastValidatedLedgerIndex - startingValidatedLedger; - // Give-up the acquiringing porocess if the instance creation itself takes more than 80% of allowed window. + diff = evernode.UtilHelpers.getCurrentUnixTime() - startingValidatedTime; + // Give-up the acquiringing porocess if the instance creation itself takes more than 80% of allowed window(in seconds). threshold = this.hostClient.config.leaseAcquireWindow * appenv.ACQUIRE_LEASE_TIMEOUT_THRESHOLD; if (diff > threshold) { - console.error(`Instance creation timeout. Took: ${diff} ledgers. Threshold: ${threshold}`); + console.error(`Instance creation timeout. Took: ${diff} seconds. Threshold: ${threshold} seconds`); // Update the lease status of the request to 'SashiTimeout'. await this.updateLeaseStatus(acquireRefId, LeaseStatus.SASHI_TIMEOUT); await this.destroyInstance(createRes.content.name, tenantAddress, leaseIndex); @@ -541,11 +649,14 @@ class MessageBoard { // Save the value to a local variable to prevent the value being updated between two calls ending up with two different values. const currentLedgerIndex = this.lastValidatedLedgerIndex; + // Lease created Timestamp + const createdTimestamp = evernode.UtilHelpers.getCurrentUnixTime(); + // Add to in-memory expiry list, so the instance will get destroyed when the moments exceed, - this.addToExpiryList(acquireRefId, createRes.content.name, tenantAddress, this.getExpiryLedger(currentLedgerIndex, moments)); + this.addToExpiryList(acquireRefId, createRes.content.name, tenantAddress, this.getExpiryTimestamp(createdTimestamp, moments)); // Update the database for acquired record. - await this.updateAcquiredRecord(acquireRefId, currentLedgerIndex); + await this.updateAcquiredRecord(acquireRefId, currentLedgerIndex, createdTimestamp); // Update the active instance count. this.activeInstanceCount++; @@ -629,13 +740,12 @@ class MessageBoard { console.log(`Received extend lease from ${tenantAddress}`); let expiryItemFound = false; - let expiryMoment; + let expiryTimeStamp; for (const item of this.expiryList) { if (item.containerName === instance.container_name) { - item.expiryLedger = this.getExpiryLedger(item.expiryLedger, extendingMoments); - expiryMoment = (await this.hostClient.getMoment(item.expiryLedger)); - + item.expiryTimestamp = this.getExpiryTimestamp(item.expiryTimestamp, extendingMoments); + expiryTimeStamp = item.expiryTimestamp; let obj = { status: LeaseStatus.EXTENDED, life_moments: (instance.life_moments + extendingMoments) @@ -650,7 +760,7 @@ class MessageBoard { throw "No matching expiration record was found for the instance"; // Send the extend success response - await this.hostClient.extendSuccess(extendRefId, tenantAddress, expiryMoment); + await this.hostClient.extendSuccess(extendRefId, tenantAddress, expiryTimeStamp); } catch (e) { @@ -662,14 +772,14 @@ class MessageBoard { } } - addToExpiryList(txHash, containerName, tenant, expiryLedger) { + addToExpiryList(txHash, containerName, tenant, expiryTimestamp) { this.expiryList.push({ txHash: txHash, containerName: containerName, tenant: tenant, - expiryLedger: expiryLedger, + expiryTimestamp: expiryTimestamp }); - console.log(`Container ${containerName} expiry set at ledger ${expiryLedger}`); + console.log(`Container ${containerName} expiry set at ${expiryTimestamp} th timestamp`); } async createLeaseTableIfNotExists() { @@ -714,7 +824,7 @@ class MessageBoard { async createLeaseRecord(txHash, txTenantAddress, containerName, moments) { await this.db.insertValue(this.leaseTable, { - timestamp: Date.now(), + timestamp: 0, tx_hash: txHash, tenant_xrp_address: txTenantAddress, life_moments: moments, @@ -729,10 +839,11 @@ class MessageBoard { }, { name: appenv.LAST_WATCHED_LEDGER }); } - async updateAcquiredRecord(txHash, ledgerIndex) { + async updateAcquiredRecord(txHash, ledgerIndex, timestamp) { await this.db.updateValue(this.leaseTable, { created_on_ledger: ledgerIndex, - status: LeaseStatus.ACQUIRED + status: LeaseStatus.ACQUIRED, + timestamp: timestamp }, { tx_hash: txHash }); } @@ -758,10 +869,17 @@ class MessageBoard { await this.db.deleteValues(this.leaseTable, { tx_hash: txHash }); } - getExpiryLedger(ledgerIndex, moments) { - return ledgerIndex + moments * this.hostClient.config.momentSize; + /** + * Calculate and return the expiring timestamp from createdTimestamp and momet count + * @param {*} createdTimestamp Timestamp + * @param { integer } moments Lifespan of the instance in moments + * @returns + */ + getExpiryTimestamp(createdTimestamp, moments) { + return createdTimestamp + moments * this.hostClient.config.momentSize; } + readConfig() { this.cfg = ConfigHelper.readConfig(this.configPath, this.secretConfigPath); } diff --git a/mb-xrpl/package-lock.json b/mb-xrpl/package-lock.json index ff54b73..926b9da 100644 --- a/mb-xrpl/package-lock.json +++ b/mb-xrpl/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "mb-xrpl", "dependencies": { - "evernode-js-client": "0.5.1", + "evernode-js-client": "0.5.3", "sqlite3": "5.0.2" }, "devDependencies": { @@ -226,7 +226,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true, "engines": { "node": ">=0.8" @@ -235,7 +235,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "optional": true }, "node_modules/available-typed-arrays": { @@ -252,7 +252,7 @@ "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "optional": true, "engines": { "node": "*" @@ -299,7 +299,7 @@ "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "dependencies": { "tweetnacl": "^0.14.3" @@ -365,7 +365,7 @@ "node_modules/block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "optional": true, "dependencies": { "inherits": "~2.0.0" @@ -444,7 +444,7 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "optional": true }, "node_modules/chalk": { @@ -480,7 +480,7 @@ "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "engines": { "node": ">=0.10.0" } @@ -518,17 +518,17 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "node_modules/create-hash": { "version": "1.2.0", @@ -572,7 +572,7 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "optional": true, "dependencies": { "assert-plus": "^1.0.0" @@ -634,7 +634,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "optional": true, "engines": { "node": ">=0.4.0" @@ -643,12 +643,12 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -671,7 +671,7 @@ "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "dependencies": { "jsbn": "~0.1.0", @@ -759,7 +759,7 @@ "node_modules/es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -937,9 +937,9 @@ } }, "node_modules/evernode-js-client": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.1.tgz", - "integrity": "sha512-KwEa1WCzu3zb5g6LIdSCqfzVPk/OrPZYBo+GRtX0WVLcCADO6QHPbPkosDdvC01gweJRSydDk/uFAoGm3G3t8Q==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.3.tgz", + "integrity": "sha512-dzkDxZuu7CIDjUe0mtaKQLrkDH1DyI1Js7wM7aVsbnlvklsTGQDQjwY7eMZxc49vtSPM0i8KqmpWdBay89Rpnw==", "dependencies": { "elliptic": "6.5.4", "ripple-address-codec": "4.2.0", @@ -957,7 +957,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "engines": [ "node >=0.6.0" ], @@ -978,7 +978,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "node_modules/file-entry-cache": { @@ -1028,7 +1028,7 @@ "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "optional": true, "engines": { "node": "*" @@ -1059,7 +1059,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fstream": { "version": "1.0.12", @@ -1113,7 +1113,7 @@ "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "node_modules/functions-have-names": { @@ -1127,7 +1127,7 @@ "node_modules/gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -1189,7 +1189,7 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "optional": true, "dependencies": { "assert-plus": "^1.0.0" @@ -1250,7 +1250,7 @@ "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "optional": true, "engines": { "node": ">=4" @@ -1337,7 +1337,7 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "node_modules/hash-base": { "version": "3.1.0", @@ -1364,7 +1364,7 @@ "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -1374,7 +1374,7 @@ "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "optional": true, "dependencies": { "assert-plus": "^1.0.0", @@ -1464,7 +1464,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, "engines": { "node": ">=0.8.19" @@ -1473,7 +1473,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1571,7 +1571,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, "engines": { "node": ">=0.10.0" @@ -1580,7 +1580,7 @@ "node_modules/is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -1729,7 +1729,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, "node_modules/is-weakref": { @@ -1746,18 +1746,18 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "devOptional": true }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "optional": true }, "node_modules/js-yaml": { @@ -1775,7 +1775,7 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "node_modules/json-schema": { @@ -1793,13 +1793,13 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "optional": true }, "node_modules/jsprim": { @@ -1892,7 +1892,7 @@ "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "node_modules/minimatch": { "version": "3.1.2", @@ -1956,7 +1956,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "node_modules/needle": { @@ -2124,7 +2124,7 @@ "node_modules/nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "optional": true, "dependencies": { "abbrev": "1" @@ -2170,7 +2170,7 @@ "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "engines": { "node": ">=0.10.0" } @@ -2187,7 +2187,7 @@ "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "engines": { "node": ">=0.10.0" } @@ -2243,7 +2243,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dependencies": { "wrappy": "1" } @@ -2268,7 +2268,7 @@ "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "engines": { "node": ">=0.10.0" } @@ -2276,7 +2276,7 @@ "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "engines": { "node": ">=0.10.0" } @@ -2305,7 +2305,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "engines": { "node": ">=0.10.0" } @@ -2337,7 +2337,7 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "optional": true }, "node_modules/prelude-ls": { @@ -2632,7 +2632,7 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "node_modules/sha.js": { "version": "2.4.11", @@ -2742,7 +2742,7 @@ "node_modules/string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2848,7 +2848,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "node_modules/tiny-secp256k1": { @@ -2883,7 +2883,7 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "optional": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -2895,7 +2895,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "node_modules/type-check": { @@ -2966,7 +2966,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/uuid": { "version": "3.4.0", @@ -2987,7 +2987,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "engines": [ "node >=0.6.0" ], @@ -3058,7 +3058,7 @@ "node_modules/wif": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", "dependencies": { "bs58check": "<3.0.0" } @@ -3075,7 +3075,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { "version": "8.8.1", @@ -3362,13 +3362,13 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "optional": true }, "available-typed-arrays": { @@ -3379,7 +3379,7 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "optional": true }, "aws4": { @@ -3409,7 +3409,7 @@ "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -3468,7 +3468,7 @@ "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "optional": true, "requires": { "inherits": "~2.0.0" @@ -3538,7 +3538,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "optional": true }, "chalk": { @@ -3568,7 +3568,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "color-convert": { "version": "2.0.1", @@ -3597,17 +3597,17 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "create-hash": { "version": "1.2.0", @@ -3648,7 +3648,7 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "optional": true, "requires": { "assert-plus": "^1.0.0" @@ -3690,18 +3690,18 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "optional": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "doctrine": { "version": "3.0.0", @@ -3715,7 +3715,7 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "requires": { "jsbn": "~0.1.0", @@ -3788,7 +3788,7 @@ "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" }, "escape-string-regexp": { "version": "4.0.0", @@ -3917,9 +3917,9 @@ "dev": true }, "evernode-js-client": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.1.tgz", - "integrity": "sha512-KwEa1WCzu3zb5g6LIdSCqfzVPk/OrPZYBo+GRtX0WVLcCADO6QHPbPkosDdvC01gweJRSydDk/uFAoGm3G3t8Q==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.3.tgz", + "integrity": "sha512-dzkDxZuu7CIDjUe0mtaKQLrkDH1DyI1Js7wM7aVsbnlvklsTGQDQjwY7eMZxc49vtSPM0i8KqmpWdBay89Rpnw==", "requires": { "elliptic": "6.5.4", "ripple-address-codec": "4.2.0", @@ -3937,7 +3937,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "optional": true }, "fast-deep-equal": { @@ -3955,7 +3955,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "file-entry-cache": { @@ -3999,7 +3999,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "optional": true }, "form-data": { @@ -4024,7 +4024,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fstream": { "version": "1.0.12", @@ -4068,7 +4068,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "functions-have-names": { @@ -4079,7 +4079,7 @@ "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4128,7 +4128,7 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "optional": true, "requires": { "assert-plus": "^1.0.0" @@ -4174,7 +4174,7 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "optional": true }, "har-validator": { @@ -4230,7 +4230,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "hash-base": { "version": "3.1.0", @@ -4254,7 +4254,7 @@ "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -4264,7 +4264,7 @@ "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "optional": true, "requires": { "assert-plus": "^1.0.0", @@ -4321,13 +4321,13 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4395,13 +4395,13 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" } @@ -4493,7 +4493,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, "is-weakref": { @@ -4507,18 +4507,18 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "devOptional": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "optional": true }, "js-yaml": { @@ -4533,7 +4533,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "json-schema": { @@ -4551,13 +4551,13 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "optional": true }, "jsprim": { @@ -4635,7 +4635,7 @@ "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.1.2", @@ -4695,7 +4695,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "needle": { @@ -4832,7 +4832,7 @@ "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "optional": true, "requires": { "abbrev": "1" @@ -4875,7 +4875,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.9.0", @@ -4886,7 +4886,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { "version": "1.12.2", @@ -4921,7 +4921,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } @@ -4943,12 +4943,12 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", @@ -4971,7 +4971,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -4994,7 +4994,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "optional": true }, "prelude-ls": { @@ -5215,7 +5215,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "sha.js": { "version": "2.4.11", @@ -5294,7 +5294,7 @@ "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5374,7 +5374,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "tiny-secp256k1": { @@ -5402,7 +5402,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "optional": true, "requires": { "safe-buffer": "^5.0.1" @@ -5411,7 +5411,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "type-check": { @@ -5470,7 +5470,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { "version": "3.4.0", @@ -5487,7 +5487,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "optional": true, "requires": { "assert-plus": "^1.0.0", @@ -5540,7 +5540,7 @@ "wif": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", "requires": { "bs58check": "<3.0.0" } @@ -5554,7 +5554,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { "version": "8.8.1", diff --git a/mb-xrpl/package.json b/mb-xrpl/package.json index b3c2b62..785a991 100644 --- a/mb-xrpl/package.json +++ b/mb-xrpl/package.json @@ -5,7 +5,7 @@ "build": "npm run lint && ncc build app.js --minify -o dist" }, "dependencies": { - "evernode-js-client": "0.5.1", + "evernode-js-client": "0.5.3", "sqlite3": "5.0.2" }, "devDependencies": { diff --git a/src/msg/json/msg_json.cpp b/src/msg/json/msg_json.cpp index 74dd925..ecd87a4 100644 --- a/src/msg/json/msg_json.cpp +++ b/src/msg/json/msg_json.cpp @@ -9,8 +9,8 @@ namespace msg::json constexpr const char *SEP_COMMA_NOQUOTE = ",\""; constexpr const char *SEP_COLON_NOQUOTE = "\":"; constexpr const char *DOUBLE_QUOTE = "\""; - constexpr uint16_t MOMENT_SIZE = 1190; // XRP ledgers per Moment. - constexpr uint16_t INSTANCE_INFO_SIZE = 488; // Size of a single instance info + constexpr uint16_t MOMENT_SIZE = 3600; // Seconds per Moment. + constexpr uint16_t INSTANCE_INFO_SIZE = 495; // Size of a single instance info /** * Parses a json message sent by the message board. * @param d Jsoncons document to which the parsed json should be loaded. @@ -723,7 +723,7 @@ namespace msg::json * "contract_id": "", * "expiry_approx_timestamp": , * "created_ledger": , - * "expiry_ledger": , + * "expiry_timestamp": , * "tenant": "", * } * ] @@ -783,9 +783,9 @@ namespace msg::json msg += SEP_COLON_NOQUOTE; msg += std::to_string(lease->created_on_ledger); msg += SEP_COMMA_NOQUOTE; - msg += "expiry_ledger"; + msg += "expiry_timestamp"; msg += SEP_COLON_NOQUOTE; - msg += std::to_string(lease->created_on_ledger + (lease->life_moments * MOMENT_SIZE)); + msg += std::to_string(lease->timestamp + (lease->life_moments * MOMENT_SIZE)); msg += SEP_COMMA_NOQUOTE; msg += "tenant"; msg += SEP_COLON; diff --git a/src/version.hpp b/src/version.hpp index 297edda..750e142 100644 --- a/src/version.hpp +++ b/src/version.hpp @@ -6,7 +6,7 @@ namespace version { // Sashimono agent version. Written to new configs. - constexpr const char *AGENT_VERSION = "0.5.12"; + constexpr const char *AGENT_VERSION = "0.5.13"; // Minimum compatible config version (this will be used to validate configs). constexpr const char *MIN_CONFIG_VERSION = "0.5.0"; diff --git a/test/evernode-cluster/package-lock.json b/test/evernode-cluster/package-lock.json index 4e9c8aa..cbb3f9c 100644 --- a/test/evernode-cluster/package-lock.json +++ b/test/evernode-cluster/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "bson": "4.6.5", - "evernode-js-client": "0.5.2", + "evernode-js-client": "0.5.3", "hotpocket-js-client": "0.5.4" } }, @@ -344,9 +344,9 @@ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" }, "node_modules/evernode-js-client": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.2.tgz", - "integrity": "sha512-xehOnUaJBZehN5DzJjCZi025v2EPP54T1EBdJbSgM28vJkWaT9Qymr90Uc09goYk6kmPU3V1zCn7aq/att+hnQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.3.tgz", + "integrity": "sha512-dzkDxZuu7CIDjUe0mtaKQLrkDH1DyI1Js7wM7aVsbnlvklsTGQDQjwY7eMZxc49vtSPM0i8KqmpWdBay89Rpnw==", "dependencies": { "elliptic": "6.5.4", "ripple-address-codec": "4.2.0", @@ -1567,9 +1567,9 @@ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" }, "evernode-js-client": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.2.tgz", - "integrity": "sha512-xehOnUaJBZehN5DzJjCZi025v2EPP54T1EBdJbSgM28vJkWaT9Qymr90Uc09goYk6kmPU3V1zCn7aq/att+hnQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/evernode-js-client/-/evernode-js-client-0.5.3.tgz", + "integrity": "sha512-dzkDxZuu7CIDjUe0mtaKQLrkDH1DyI1Js7wM7aVsbnlvklsTGQDQjwY7eMZxc49vtSPM0i8KqmpWdBay89Rpnw==", "requires": { "elliptic": "6.5.4", "ripple-address-codec": "4.2.0", diff --git a/test/evernode-cluster/package.json b/test/evernode-cluster/package.json index ee87272..576e4e7 100644 --- a/test/evernode-cluster/package.json +++ b/test/evernode-cluster/package.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "bson": "4.6.5", - "evernode-js-client": "0.5.2", + "evernode-js-client": "0.5.3", "hotpocket-js-client": "0.5.4" } }