evernode-js-client 0.5.13 → 0.5.14
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +3 -25
- package/index.js +15877 -0
- package/package.json +1 -10
- package/.eslintrc.json +0 -14
- package/LICENSE +0 -21
- package/clean-pkg.sh +0 -4
- package/npm-readme.md +0 -4
- package/remove-versions.sh +0 -10
- package/src/clients/base-evernode-client.js +0 -610
- package/src/clients/host-client.js +0 -560
- package/src/clients/registry-client.js +0 -54
- package/src/clients/tenant-client.js +0 -276
- package/src/defaults.js +0 -21
- package/src/eccrypto.js +0 -258
- package/src/encryption-helper.js +0 -96
- package/src/event-emitter.js +0 -45
- package/src/evernode-common.js +0 -113
- package/src/evernode-helpers.js +0 -45
- package/src/firestore/firestore-handler.js +0 -309
- package/src/index.js +0 -37
- package/src/state-helpers.js +0 -396
- package/src/transaction-helper.js +0 -62
- package/src/util-helpers.js +0 -50
- package/src/xfl-helpers.js +0 -130
- package/src/xrpl-account.js +0 -515
- package/src/xrpl-api.js +0 -301
- package/src/xrpl-common.js +0 -17
- package/test/package-lock.json +0 -884
- package/test/package.json +0 -9
- package/test/test.js +0 -409
package/test/package.json
DELETED
package/test/test.js
DELETED
@@ -1,409 +0,0 @@
|
|
1
|
-
// const evernode = require("evernode-js-client");
|
2
|
-
const evernode = require("../dist"); // Local dist dir. (use 'npm run build' to update)
|
3
|
-
const codec = require('ripple-address-codec');
|
4
|
-
|
5
|
-
const evrIssuerAddress = "rEm71QHHXJzGULG4mkR3yhLz6EZYgvuwwP";
|
6
|
-
const registryAddress = "raaFre81618XegCrzTzVotAmarBcqNSAvK";
|
7
|
-
const registrySecret = "snrUSoLVodmhVCDNL92K1UafzQDjH";
|
8
|
-
const hostAddress = "rNJDQu9pUretQetmxeHRPkasM4o7chdML2";
|
9
|
-
const hostSecret = "ss11mwRSG4UxXQ9LakyYTmAzisnN2";
|
10
|
-
const foundationAddress = "rMRRzwe2mPhtVJYkBsPYbxkrHdExAduqWi";
|
11
|
-
const foundationSecret = "sncQEvGmeMrVGAvkMiLkmE3hrtVH9";
|
12
|
-
const tenantAddress = "rw7GPreCDX2nuJVHSwNdH38ZGsiEH8qiY";
|
13
|
-
const tenantSecret = "shdQBGbF9d3Tgp3D28pXoBdhWoZ9N";
|
14
|
-
const initializerAddress = 'rMv668j9M6x2ww4HNEF4AhB8ju77oSxFJD';
|
15
|
-
const initializerSecret = 'sn6TNZivVQY9KxXrLy8XdH9oXk3aG';
|
16
|
-
const transfereeAddress = 'rNAW13zAUA4DjkM45peek3WhUs23GZ2fYD';
|
17
|
-
|
18
|
-
const tosHash = "757A0237B44D8B2BBB04AE2BAD5813858E0AECD2F0B217075E27E0630BA74314";
|
19
|
-
|
20
|
-
const clients = [];
|
21
|
-
|
22
|
-
async function app() {
|
23
|
-
|
24
|
-
// Use a singleton xrplApi for all tests.
|
25
|
-
const xrplApi = new evernode.XrplApi('wss://hooks-testnet-v2.xrpl-labs.com');
|
26
|
-
evernode.Defaults.set({
|
27
|
-
registryAddress: registryAddress,
|
28
|
-
xrplApi: xrplApi
|
29
|
-
})
|
30
|
-
|
31
|
-
try {
|
32
|
-
await xrplApi.connect();
|
33
|
-
|
34
|
-
// Process of minting and selling a NFT.
|
35
|
-
|
36
|
-
// Account1: selling party.
|
37
|
-
// const acc1 = new evernode.XrplAccount(ownerAddress, ownerSecret);
|
38
|
-
// // Mint an nft with some data included in uri (256 bytes). xrpl doesn't check for uniqueness of data.
|
39
|
-
// // We need to make it unique in order to later find the token by uri.
|
40
|
-
// const uri = "mynft custom data";
|
41
|
-
// await acc1.mintNft(uri, 0, 0, true);
|
42
|
-
// // Get the minted nft information and sell it on the dex.
|
43
|
-
// const nft = await acc1.getNftByUri(uri);
|
44
|
-
// console.log(nft);
|
45
|
-
// // Make a sell offer (for free) while restricting it to be only purchased by the specified party.
|
46
|
-
// await acc1.offerSellNft(nft.NFTokenID, '0', 'XRP', null, hostAddress);
|
47
|
-
|
48
|
-
// // Account2: Buying party.
|
49
|
-
// const acc2 = new evernode.XrplAccount(hostAddress, hostSecret);
|
50
|
-
// // await acc2.offerBuyNft(nft.NFTokenID, registryAddress, '10', 'EVR', evrIssuerAddress);
|
51
|
-
|
52
|
-
// // const offers = await acc1.getNftOffers();
|
53
|
-
// // console.log(offers);
|
54
|
-
// // Find the sellOffer information from seller's account.
|
55
|
-
// const sellOffer = (await acc1.getNftOffers()).find(o => o.NFTokenID == nft.NFTokenID);
|
56
|
-
// console.log(sellOffer);
|
57
|
-
// // Buy the NFT by accepting the sell offer.
|
58
|
-
// await acc2.buyNft(sellOffer.index);
|
59
|
-
// // Get information about the purchased nft.
|
60
|
-
// const nft2 = await acc2.getNftByUri(uri);
|
61
|
-
// console.log(nft2);
|
62
|
-
|
63
|
-
const tests = [
|
64
|
-
// () => initializeConfigs(),
|
65
|
-
// () => getHookStates(),
|
66
|
-
// () => registerHost(),
|
67
|
-
// () => getHostInfo(),
|
68
|
-
// () => updateInfo(),
|
69
|
-
// () => getAllHosts(),
|
70
|
-
// () => getActiveHosts(),
|
71
|
-
// () => heartbeatHost(),
|
72
|
-
// () => acquire("success"),
|
73
|
-
// () => acquire("error"),
|
74
|
-
// () => acquire("timeout"),
|
75
|
-
// () => extendLease("success"),
|
76
|
-
// () => extendLease("error"),
|
77
|
-
// () => extendLease("timeout"),
|
78
|
-
// () => deregisterHost(),
|
79
|
-
// () => getAllConfigs(),
|
80
|
-
// () => pruneDeadHost(),
|
81
|
-
// () => transferHost(),
|
82
|
-
// () => requestRebate()
|
83
|
-
|
84
|
-
];
|
85
|
-
|
86
|
-
for (const test of tests) {
|
87
|
-
await test();
|
88
|
-
await Promise.all(clients.map(c => c.disconnect())); // Cleanup clients after every test.
|
89
|
-
}
|
90
|
-
|
91
|
-
// await registerHost();
|
92
|
-
// Accepting the sell offer created by registry.
|
93
|
-
|
94
|
-
// const tokenID = '0008000083CD166E1806EF2076C55077AEFD418E771A516CB30E8CAE00000013';
|
95
|
-
// const reg = new evernode.XrplAccount(registryAddress, registrySecret);
|
96
|
-
// const sellOffer = (await reg.getNftOffers()).find(o => o.NFTokenID == tokenID);
|
97
|
-
// console.log(sellOffer);
|
98
|
-
// const host = new evernode.XrplAccount(hostAddress, hostSecret);
|
99
|
-
// await host.buyNft(sellOffer.index);
|
100
|
-
// const nfts = await host.getNfts();
|
101
|
-
// console.log(nfts);
|
102
|
-
// await host.register();
|
103
|
-
// await initializeConfigs();
|
104
|
-
// await registerHost();
|
105
|
-
// await deregisterHost();
|
106
|
-
// await getHookStates()
|
107
|
-
|
108
|
-
}
|
109
|
-
catch (e) {
|
110
|
-
console.error("Error occured:", e);
|
111
|
-
}
|
112
|
-
finally {
|
113
|
-
// Added this timeout since some tests failed with not connected error.
|
114
|
-
await new Promise(resolve => setTimeout(resolve, 4000)); // Wait for four seconds before disconnecting.
|
115
|
-
await xrplApi.disconnect();
|
116
|
-
}
|
117
|
-
}
|
118
|
-
|
119
|
-
async function updateInfo() {
|
120
|
-
console.log(`-----------Update host`);
|
121
|
-
|
122
|
-
const client = await getHostClient();
|
123
|
-
await client.updateRegInfo(10);
|
124
|
-
}
|
125
|
-
|
126
|
-
async function getActiveHosts() {
|
127
|
-
console.log(`-----------Getting active hosts`);
|
128
|
-
|
129
|
-
const regClient = await getRegistryClient();
|
130
|
-
const hosts = await regClient.getActiveHosts();
|
131
|
-
|
132
|
-
console.log("Hosts", hosts || "No active hosts");
|
133
|
-
}
|
134
|
-
|
135
|
-
async function initializeConfigs() {
|
136
|
-
console.log(`-----------Initialize configs`);
|
137
|
-
let memoData = Buffer.allocUnsafe(40);
|
138
|
-
codec.decodeAccountID(evrIssuerAddress).copy(memoData);
|
139
|
-
codec.decodeAccountID(foundationAddress).copy(memoData, 20);
|
140
|
-
|
141
|
-
const initAccount = new evernode.XrplAccount(initializerAddress, initializerSecret);
|
142
|
-
await initAccount.makePayment(registryAddress, '1', 'XRP', null,
|
143
|
-
[{ type: 'evnInitialize', format: 'hex', data: memoData.toString('hex') }]);
|
144
|
-
}
|
145
|
-
|
146
|
-
async function registerHost(address = hostAddress, secret = hostSecret) {
|
147
|
-
const host = await getHostClient(address, secret);
|
148
|
-
|
149
|
-
if (await host.isRegistered())
|
150
|
-
return true;
|
151
|
-
|
152
|
-
console.log(`-----------Register host`);
|
153
|
-
|
154
|
-
// Prepare host account for Evernode.
|
155
|
-
console.log("Prepare...");
|
156
|
-
await host.prepareAccount("mydomain.com");
|
157
|
-
|
158
|
-
// Get EVRs from the foundation if needed.
|
159
|
-
const lines = await host.xrplAcc.getTrustLines(evernode.EvernodeConstants.EVR, evrIssuerAddress);
|
160
|
-
if (lines.length === 0 || parseInt(lines[0].balance) < 5120) {
|
161
|
-
console.log("Transfer EVRs...");
|
162
|
-
const foundationAcc = new evernode.XrplAccount(foundationAddress, foundationSecret);
|
163
|
-
await foundationAcc.makePayment(address, "5120", evernode.EvernodeConstants.EVR, evrIssuerAddress);
|
164
|
-
}
|
165
|
-
|
166
|
-
console.log("Register...");
|
167
|
-
const instanceCount = 3;
|
168
|
-
await host.register("AU", 10000, 512, 1024, instanceCount, 'Intel', 10, 10, "Test desctiption", "testemail@gmail.com", 2);
|
169
|
-
|
170
|
-
console.log("Lease Offer...");
|
171
|
-
for (let i = 0; i < instanceCount; i++)
|
172
|
-
await host.offerLease(i, 2, tosHash);
|
173
|
-
|
174
|
-
// Verify the registration.
|
175
|
-
return await host.isRegistered();
|
176
|
-
}
|
177
|
-
|
178
|
-
async function deregisterHost(address = hostAddress, secret = hostSecret) {
|
179
|
-
const host = await getHostClient(address, secret);
|
180
|
-
|
181
|
-
if (!await host.isRegistered())
|
182
|
-
return true;
|
183
|
-
|
184
|
-
console.log(`-----------Deregister host`);
|
185
|
-
|
186
|
-
await host.deregister();
|
187
|
-
|
188
|
-
// Burn NFTs.
|
189
|
-
const nfts = (await host.xrplAcc.getNfts()).filter(n => n.URI.startsWith(evernode.EvernodeConstants.LEASE_NFT_PREFIX_HEX))
|
190
|
-
.map(o => { return { nfTokenId: o.NFTokenID, ownerAddress: host.xrplAcc.address }; });
|
191
|
-
for (const nft of nfts) {
|
192
|
-
const sold = nft.ownerAddress !== host.xrplAcc.address;
|
193
|
-
await host.xrplAcc.burnNft(nft.nfTokenId, sold ? nft.ownerAddress : null);
|
194
|
-
console.log(`Burnt ${sold ? 'sold' : 'unsold'} hosting NFT (${nft.nfTokenId}) of ${nft.ownerAddress + (sold ? ' tenant' : '')} account`);
|
195
|
-
}
|
196
|
-
|
197
|
-
// Verify the deregistration.
|
198
|
-
return !await host.isRegistered();
|
199
|
-
}
|
200
|
-
|
201
|
-
async function heartbeatHost(address = hostAddress, secret = hostSecret) {
|
202
|
-
const host = await getHostClient(address, secret);
|
203
|
-
|
204
|
-
if (!await host.isRegistered())
|
205
|
-
return true;
|
206
|
-
|
207
|
-
console.log(`-----------Heartbeat host`);
|
208
|
-
|
209
|
-
await host.heartbeat();
|
210
|
-
}
|
211
|
-
|
212
|
-
async function acquire(scenario) {
|
213
|
-
console.log(`-----------Acquire (${scenario})`);
|
214
|
-
|
215
|
-
const tenant = await getTenantClient();
|
216
|
-
await tenant.prepareAccount();
|
217
|
-
|
218
|
-
// Setup host to watch for incoming acquires.
|
219
|
-
const host = await getHostClient();
|
220
|
-
|
221
|
-
host.on(evernode.HostEvents.AcquireLease, async (r) => {
|
222
|
-
console.log("Host received acquire request: ", r.payload);
|
223
|
-
|
224
|
-
if (scenario !== "timeout") {
|
225
|
-
console.log(`Host submitting ${scenario} response...`);
|
226
|
-
await new Promise(resolve => setTimeout(resolve, 4000));
|
227
|
-
|
228
|
-
if (scenario === "success")
|
229
|
-
await host.acquireSuccess(r.acquireRefId, r.tenant, { content: "dummy success" });
|
230
|
-
else if (scenario === "error") {
|
231
|
-
const nft = (await (new evernode.XrplAccount(r.tenant)).getNfts())?.find(n => n.NFTokenID == r.nfTokenId);
|
232
|
-
const leaseIndex = Buffer.from(nft.URI, 'hex').readUint16BE(evernode.EvernodeConstants.LEASE_NFT_PREFIX_HEX.length);
|
233
|
-
|
234
|
-
await host.expireLease(r.nfTokenId, r.tenant);
|
235
|
-
await host.offerLease(leaseIndex, r.leaseAmount, tosHash);
|
236
|
-
await host.acquireError(r.acquireRefId, r.tenant, r.leaseAmount, "dummy_error");
|
237
|
-
}
|
238
|
-
}
|
239
|
-
})
|
240
|
-
|
241
|
-
await fundTenant(tenant);
|
242
|
-
|
243
|
-
try {
|
244
|
-
const timeout = (scenario === "timeout" ? 10000 : 30000);
|
245
|
-
const result = await tenant.acquireLease(hostAddress, {
|
246
|
-
owner_pubkey: "ed5cb83404120ac759609819591ef839b7d222c84f1f08b3012f490586159d2b50",
|
247
|
-
contract_id: "dc411912-bcdd-4f73-af43-32ec45844b9a",
|
248
|
-
image: "evernodedev/sashimono:hp.latest-ubt.20.04-njs.16",
|
249
|
-
config: {}
|
250
|
-
}, { timeout: timeout });
|
251
|
-
console.log('Tenant received instance ', result.instance);
|
252
|
-
}
|
253
|
-
catch (err) {
|
254
|
-
console.log("Tenant recieved acquire error: ", err.reason)
|
255
|
-
}
|
256
|
-
}
|
257
|
-
|
258
|
-
async function extendLease(scenario) {
|
259
|
-
console.log(`-----------Extend lease (${scenario})`);
|
260
|
-
|
261
|
-
const tenant = await getTenantClient();
|
262
|
-
await tenant.prepareAccount();
|
263
|
-
|
264
|
-
// Setup host to watch for incoming acquires.
|
265
|
-
const host = await getHostClient();
|
266
|
-
|
267
|
-
host.on(evernode.HostEvents.ExtendLease, async (r) => {
|
268
|
-
|
269
|
-
console.log(`Host received extend request for: '${r.nfTokenId}'`);
|
270
|
-
|
271
|
-
console.log(`Host submitting ${scenario} response...`);
|
272
|
-
await new Promise(resolve => setTimeout(resolve, 4000));
|
273
|
-
|
274
|
-
if (scenario === "success")
|
275
|
-
await host.extendSuccess(r.extendRefId, r.tenant, { content: "dummy success" }).catch(console.error);
|
276
|
-
else if (scenario === "error") {
|
277
|
-
await host.extendError(r.extendRefId, r.tenant, "dummy_error", r.payment.toString()).catch(console.error);
|
278
|
-
}
|
279
|
-
})
|
280
|
-
|
281
|
-
await fundTenant(tenant);
|
282
|
-
|
283
|
-
try {
|
284
|
-
const timeout = (scenario === "timeout" ? 10000 : 30000);
|
285
|
-
const tokenIDs = (await tenant.xrplAcc.getNfts()).map(n => n.NFTokenID);
|
286
|
-
const result = await tenant.extendLease(hostAddress, 2, tokenIDs[0], { timeout: timeout });
|
287
|
-
console.log(`Extend ref id: ${result.extendeRefId}, Expiry moments: ${result.expiryMoment}`);
|
288
|
-
}
|
289
|
-
catch (err) {
|
290
|
-
console.log("Tenant recieved extend error: ", err.reason)
|
291
|
-
}
|
292
|
-
}
|
293
|
-
//////////////////////////////////////////////////////////////////////////////////////
|
294
|
-
|
295
|
-
async function getTenantClient() {
|
296
|
-
const client = new evernode.TenantClient(tenantAddress, tenantSecret);
|
297
|
-
await client.connect();
|
298
|
-
clients.push(client);
|
299
|
-
return client;
|
300
|
-
}
|
301
|
-
|
302
|
-
async function getHostClient(address = hostAddress, secret = hostSecret) {
|
303
|
-
const client = new evernode.HostClient(address, secret);
|
304
|
-
await client.connect();
|
305
|
-
clients.push(client);
|
306
|
-
return client;
|
307
|
-
}
|
308
|
-
|
309
|
-
async function getRegistryClient() {
|
310
|
-
const client = new evernode.RegistryClient(registryAddress, registrySecret);
|
311
|
-
await client.connect();
|
312
|
-
clients.push(client);
|
313
|
-
return client;
|
314
|
-
}
|
315
|
-
|
316
|
-
async function fundTenant(tenant) {
|
317
|
-
// Send hosting tokens to tenant if needed.
|
318
|
-
const lines = await tenant.xrplAcc.getTrustLines('EVR', evrIssuerAddress);
|
319
|
-
if (lines.length === 0 || parseInt(lines[0].balance) < 1) {
|
320
|
-
await tenant.xrplAcc.setTrustLine('EVR', evrIssuerAddress, "99999999");
|
321
|
-
await new evernode.XrplAccount(foundationAddress, foundationSecret).makePayment(tenantAddress, "1000", 'EVR', evrIssuerAddress);
|
322
|
-
}
|
323
|
-
}
|
324
|
-
|
325
|
-
async function getHookStates() {
|
326
|
-
const registryClient = new evernode.RegistryClient(registryAddress, registrySecret);
|
327
|
-
await registryClient.connect();
|
328
|
-
const states = await registryClient.getHookStates();
|
329
|
-
console.log(states.length, states);
|
330
|
-
}
|
331
|
-
|
332
|
-
async function getAllHosts() {
|
333
|
-
console.log(`-----------Getting all hosts (including inactive)`);
|
334
|
-
const registryClient = new evernode.RegistryClient(registryAddress, registrySecret);
|
335
|
-
await registryClient.connect();
|
336
|
-
const hosts = await registryClient.getAllHosts();
|
337
|
-
console.log(hosts.length, hosts);
|
338
|
-
}
|
339
|
-
|
340
|
-
|
341
|
-
async function getAllConfigs() {
|
342
|
-
console.log(`-----------Getting all configs`);
|
343
|
-
const registryClient = new evernode.RegistryClient(registryAddress, registrySecret);
|
344
|
-
await registryClient.connect();
|
345
|
-
const configs = await registryClient.getAllConfigs();
|
346
|
-
console.log(configs.length, configs);
|
347
|
-
}
|
348
|
-
|
349
|
-
async function getHostInfo() {
|
350
|
-
const host = await getHostClient();
|
351
|
-
const hostInfo = await host.getHostInfo();
|
352
|
-
console.log(hostInfo);
|
353
|
-
return hostInfo;
|
354
|
-
}
|
355
|
-
|
356
|
-
async function pruneDeadHost(address = hostAddress) {
|
357
|
-
console.log(`-----------Prune host`);
|
358
|
-
|
359
|
-
// Create a cleint to send the prune request (the client can be a tenant or another host).
|
360
|
-
const tenantClient = await getTenantClient();
|
361
|
-
await tenantClient.pruneDeadHost(address);
|
362
|
-
}
|
363
|
-
|
364
|
-
async function transferHost(address = transfereeAddress) {
|
365
|
-
|
366
|
-
const host = await getHostClient(hostAddress, hostSecret);
|
367
|
-
|
368
|
-
if (!await host.isRegistered()) {
|
369
|
-
console.log("Host is not registered.");
|
370
|
-
return true;
|
371
|
-
}
|
372
|
-
|
373
|
-
console.log(`-----------Transfer host`);
|
374
|
-
|
375
|
-
// Get EVRs from the foundation if needed.
|
376
|
-
const lines = await host.xrplAcc.getTrustLines(evernode.EvernodeConstants.EVR, evrIssuerAddress);
|
377
|
-
if (lines.length === 0 || parseInt(lines[0].balance) < 1) {
|
378
|
-
console.log("Transfer EVRs...");
|
379
|
-
const foundationAcc = new evernode.XrplAccount(foundationAddress, foundationSecret);
|
380
|
-
await foundationAcc.makePayment(hostAddress, "1", evernode.EvernodeConstants.EVR, evrIssuerAddress);
|
381
|
-
}
|
382
|
-
|
383
|
-
console.log("Initiating a transfer...");
|
384
|
-
await host.transfer(address);
|
385
|
-
|
386
|
-
// Burn NFTs.
|
387
|
-
const nfts = (await host.xrplAcc.getNfts()).filter(n => n.URI.startsWith(evernode.EvernodeConstants.LEASE_NFT_PREFIX_HEX))
|
388
|
-
.map(o => { return { nfTokenId: o.NFTokenID, ownerAddress: host.xrplAcc.address }; });
|
389
|
-
for (const nft of nfts) {
|
390
|
-
const sold = nft.ownerAddress !== host.xrplAcc.address;
|
391
|
-
await host.xrplAcc.burnNft(nft.nfTokenId, sold ? nft.ownerAddress : null);
|
392
|
-
console.log(`Burnt ${sold ? 'sold' : 'unsold'} hosting NFT (${nft.nfTokenId}) of ${nft.ownerAddress + (sold ? ' tenant' : '')} account`);
|
393
|
-
}
|
394
|
-
|
395
|
-
}
|
396
|
-
|
397
|
-
async function requestRebate() {
|
398
|
-
const host = await getHostClient(hostAddress, hostSecret);
|
399
|
-
|
400
|
-
if (!await host.isRegistered()) {
|
401
|
-
console.log("Host is not registered.");
|
402
|
-
return true;
|
403
|
-
}
|
404
|
-
|
405
|
-
console.log(`-----------Request rebate`);
|
406
|
-
await host.requestRebate();
|
407
|
-
}
|
408
|
-
|
409
|
-
app();
|