@ledgerhq/coin-tester 0.3.0-nightly.0 → 0.4.0-next.0
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/.turbo/turbo-build.log +2 -2
- package/CHANGELOG.md +13 -1
- package/lib/main.js +99 -111
- package/lib/main.js.map +1 -1
- package/lib/signers/speculos.d.ts.map +1 -1
- package/lib/signers/speculos.js +65 -81
- package/lib/signers/speculos.js.map +1 -1
- package/lib-es/main.js +99 -111
- package/lib-es/main.js.map +1 -1
- package/lib-es/signers/speculos.d.ts.map +1 -1
- package/lib-es/signers/speculos.js +65 -81
- package/lib-es/signers/speculos.js.map +1 -1
- package/package.json +6 -6
- package/src/main.ts +1 -1
- package/src/signers/speculos.ts +1 -0
- package/tsconfig.json +0 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @ledgerhq/coin-tester@0.
|
|
3
|
-
> tsc && tsc -m
|
|
2
|
+
> @ledgerhq/coin-tester@0.3.0 build /home/runner/work/ledger-live/ledger-live/libs/coin-tester
|
|
3
|
+
> tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es
|
|
4
4
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# @ledgerhq/coin-tester
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 0.4.0-next.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#9248](https://github.com/LedgerHQ/ledger-live/pull/9248) [`94a59f2`](https://github.com/LedgerHQ/ledger-live/commit/94a59f2030b8b25962e183919017a1e25454fdfb) Thanks [@francois-guerin-ledger](https://github.com/francois-guerin-ledger)! - fix (coin-tester): stop EVM coin tester smoothly
|
|
8
|
+
|
|
9
|
+
## 0.3.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#8412](https://github.com/LedgerHQ/ledger-live/pull/8412) [`0397e32`](https://github.com/LedgerHQ/ledger-live/commit/0397e32253ea2af6fc901d69b51f6a59896f3e6a) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Coin-tester clean up. Fixing italian typo (sorry pasta bros), fixing Polkadot coin-tester log noise & docker-compose.
|
|
14
|
+
|
|
15
|
+
## 0.3.0-next.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
|
6
18
|
|
package/lib/main.js
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
4
|
};
|
|
@@ -15,114 +6,111 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
6
|
exports.executeScenario = executeScenario;
|
|
16
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
17
8
|
const rxjs_1 = require("rxjs");
|
|
18
|
-
function executeScenario(scenario) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
9
|
+
async function executeScenario(scenario) {
|
|
10
|
+
try {
|
|
11
|
+
const { accountBridge, currencyBridge, account, retryInterval, retryLimit, onSignerConfirmation, } = await scenario.setup();
|
|
12
|
+
console.log("Setup completed ✓");
|
|
13
|
+
console.log("\n");
|
|
14
|
+
console.log(chalk_1.default.bgBlue(" Address "), " → ", chalk_1.default.bold.blue(account.freshAddress), "\n\n");
|
|
15
|
+
const data = await currencyBridge.preload(account.currency);
|
|
16
|
+
currencyBridge.hydrate(data, account.currency);
|
|
17
|
+
console.log("Preload + hydrate completed ✓");
|
|
18
|
+
await scenario.beforeSync?.();
|
|
19
|
+
console.log("Running a synchronization on the account...");
|
|
20
|
+
let scenarioAccount = await (0, rxjs_1.firstValueFrom)(accountBridge
|
|
21
|
+
.sync(account, { paginationConfig: {} })
|
|
22
|
+
.pipe((0, rxjs_1.reduce)((acc, f) => f(acc), account)));
|
|
23
|
+
console.log("Synchronization completed ✓");
|
|
24
|
+
await scenario.beforeAll?.(scenarioAccount);
|
|
25
|
+
console.log("BeforeAll completed ✓");
|
|
26
|
+
console.log("\n\n");
|
|
27
|
+
console.log(chalk_1.default.bgCyan.black.bold(" ✧ "), " ", chalk_1.default.cyan(`Scenario: ${chalk_1.default.italic.bold(scenario.name)}`), " ", chalk_1.default.bgCyan.black.bold(" ✧ "), " → ", chalk_1.default.bold.cyan(" Starting ◌"));
|
|
28
|
+
const scenarioTransactions = scenario.getTransactions(account.freshAddress);
|
|
29
|
+
for (const testTransaction of scenarioTransactions) {
|
|
24
30
|
console.log("\n");
|
|
25
|
-
console.log(chalk_1.default.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
31
|
+
console.log(chalk_1.default.cyan("Transaction:", chalk_1.default.bold(testTransaction.name), "◌"));
|
|
32
|
+
await scenario.beforeEach?.(scenarioAccount);
|
|
33
|
+
console.log("Before each ✔️");
|
|
34
|
+
if (scenarioTransactions.indexOf(testTransaction) > 0) {
|
|
35
|
+
await scenario.beforeSync?.();
|
|
36
|
+
scenarioAccount = await (0, rxjs_1.firstValueFrom)(accountBridge
|
|
37
|
+
.sync(scenarioAccount, { paginationConfig: {} })
|
|
38
|
+
.pipe((0, rxjs_1.reduce)((acc, f) => f(acc), scenarioAccount)));
|
|
39
|
+
}
|
|
40
|
+
const previousAccount = Object.freeze(scenarioAccount);
|
|
41
|
+
const defaultTransaction = accountBridge.createTransaction(scenarioAccount);
|
|
42
|
+
const transaction = await accountBridge.prepareTransaction(scenarioAccount, {
|
|
43
|
+
...defaultTransaction,
|
|
44
|
+
...testTransaction,
|
|
45
|
+
});
|
|
46
|
+
console.log(" → ", "🧑🍳 ", chalk_1.default.bold("Prepared the transaction"), "✓");
|
|
47
|
+
const status = await accountBridge.getTransactionStatus(scenarioAccount, transaction);
|
|
48
|
+
if (Object.entries(status.errors).length) {
|
|
49
|
+
throw new Error(`${testTransaction.name} transaction\nError in transaction status: ${JSON.stringify(status.errors, null, 3)}`);
|
|
50
|
+
}
|
|
51
|
+
console.log(" → ", "🪲 ", chalk_1.default.bold("No status errors detected"), "✓");
|
|
52
|
+
const { signedOperation } = await (0, rxjs_1.firstValueFrom)(accountBridge
|
|
53
|
+
.signOperation({
|
|
54
|
+
account: scenarioAccount,
|
|
55
|
+
transaction,
|
|
56
|
+
deviceId: "",
|
|
57
|
+
})
|
|
58
|
+
.pipe((0, rxjs_1.map)(e => {
|
|
59
|
+
if (e.type === "device-signature-requested") {
|
|
60
|
+
onSignerConfirmation?.(e);
|
|
50
61
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
return e;
|
|
63
|
+
}), (0, rxjs_1.first)((e) => e.type === "signed")));
|
|
64
|
+
console.log(" → ", "🔏 ", chalk_1.default.bold("Signed the transaction"), "✓");
|
|
65
|
+
const optimisticOperation = await accountBridge.broadcast({
|
|
66
|
+
signedOperation,
|
|
67
|
+
account: scenarioAccount,
|
|
68
|
+
});
|
|
69
|
+
console.log(" → ", "🛫 ", chalk_1.default.bold("Broadcasted the transaction"), "✓");
|
|
70
|
+
const retry_limit = retryLimit ?? 10;
|
|
71
|
+
async function expectHandler(retry) {
|
|
72
|
+
await scenario.beforeSync?.();
|
|
73
|
+
scenarioAccount = await (0, rxjs_1.firstValueFrom)(accountBridge
|
|
74
|
+
.sync({ ...scenarioAccount, pendingOperations: [optimisticOperation] }, { paginationConfig: {} })
|
|
75
|
+
.pipe((0, rxjs_1.reduce)((acc, f) => f(acc), scenarioAccount)));
|
|
76
|
+
if (!testTransaction.expect) {
|
|
77
|
+
console.warn(chalk_1.default.yellow(`No expects in the transaction ${chalk_1.default.bold(testTransaction.name)}. You might want to add tests in this transaction.`));
|
|
78
|
+
return;
|
|
58
79
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (e.type === "device-signature-requested") {
|
|
68
|
-
onSignerConfirmation === null || onSignerConfirmation === void 0 ? void 0 : onSignerConfirmation(e);
|
|
69
|
-
}
|
|
70
|
-
return e;
|
|
71
|
-
}), (0, rxjs_1.first)((e) => e.type === "signed")));
|
|
72
|
-
console.log(" → ", "🔏 ", chalk_1.default.bold("Signed the transaction"), "✓");
|
|
73
|
-
const optimisticOperation = yield accountBridge.broadcast({
|
|
74
|
-
signedOperation,
|
|
75
|
-
account: scenarioAccount,
|
|
76
|
-
});
|
|
77
|
-
console.log(" → ", "🛫 ", chalk_1.default.bold("Broadcasted the transaction"), "✓");
|
|
78
|
-
const retry_limit = retryLimit !== null && retryLimit !== void 0 ? retryLimit : 10;
|
|
79
|
-
function expectHandler(retry) {
|
|
80
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
-
var _a, _b, _c;
|
|
82
|
-
yield ((_a = scenario.beforeSync) === null || _a === void 0 ? void 0 : _a.call(scenario));
|
|
83
|
-
scenarioAccount = yield (0, rxjs_1.firstValueFrom)(accountBridge
|
|
84
|
-
.sync(Object.assign(Object.assign({}, scenarioAccount), { pendingOperations: [optimisticOperation] }), { paginationConfig: {} })
|
|
85
|
-
.pipe((0, rxjs_1.reduce)((acc, f) => f(acc), scenarioAccount)));
|
|
86
|
-
if (!testTransaction.expect) {
|
|
87
|
-
console.warn(chalk_1.default.yellow(`No expects in the transaction ${chalk_1.default.bold(testTransaction.name)}. You might want to add tests in this transaction.`));
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
try {
|
|
91
|
-
(_b = testTransaction.expect) === null || _b === void 0 ? void 0 : _b.call(testTransaction, previousAccount, scenarioAccount);
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
if (!((_c = err === null || err === void 0 ? void 0 : err.matcherResult) === null || _c === void 0 ? void 0 : _c.pass)) {
|
|
95
|
-
if (retry === 0) {
|
|
96
|
-
console.error(chalk_1.default.red(`Retried ${retry_limit} time(s) and could not assert all expects for transaction ${chalk_1.default.bold(testTransaction.name)}`));
|
|
97
|
-
throw err;
|
|
98
|
-
}
|
|
99
|
-
console.warn(chalk_1.default.magenta("Test asssertion failed. Retrying..."));
|
|
100
|
-
yield new Promise(resolve => setTimeout(resolve, retryInterval !== null && retryInterval !== void 0 ? retryInterval : 3 * 1000));
|
|
101
|
-
yield expectHandler(retry - 1);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
throw err;
|
|
105
|
-
}
|
|
80
|
+
try {
|
|
81
|
+
testTransaction.expect?.(previousAccount, scenarioAccount);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
if (!err?.matcherResult?.pass) {
|
|
85
|
+
if (retry === 0) {
|
|
86
|
+
console.error(chalk_1.default.red(`Retried ${retry_limit} time(s) and could not assert all expects for transaction ${chalk_1.default.bold(testTransaction.name)}`));
|
|
87
|
+
throw err;
|
|
106
88
|
}
|
|
107
|
-
|
|
89
|
+
console.warn(chalk_1.default.magenta("Test asssertion failed. Retrying..."));
|
|
90
|
+
await new Promise(resolve => setTimeout(resolve, retryInterval ?? 3 * 1000));
|
|
91
|
+
await expectHandler(retry - 1);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
108
96
|
}
|
|
109
|
-
yield ((_e = scenario.mockIndexer) === null || _e === void 0 ? void 0 : _e.call(scenario, scenarioAccount, optimisticOperation));
|
|
110
|
-
yield expectHandler(retry_limit);
|
|
111
|
-
yield ((_f = scenario.afterEach) === null || _f === void 0 ? void 0 : _f.call(scenario, scenarioAccount));
|
|
112
|
-
console.log("After each ✔️");
|
|
113
|
-
console.log(chalk_1.default.green("Transaction:", chalk_1.default.bold(testTransaction.name), "completed ✓"));
|
|
114
97
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
console.log(
|
|
120
|
-
}
|
|
121
|
-
catch (err) {
|
|
122
|
-
console.error("\n\n", chalk_1.default.bgRed.black.bold(" ✧ "), " ", chalk_1.default.red(`Scenario: ${chalk_1.default.italic.bold(scenario.name)}`), " ", chalk_1.default.bgRed.black.bold(" ✧ "), " → ", chalk_1.default.bold.red(" Failed ❌"), "\n\n");
|
|
123
|
-
yield ((_j = scenario.teardown) === null || _j === void 0 ? void 0 : _j.call(scenario));
|
|
124
|
-
throw err;
|
|
98
|
+
await scenario.mockIndexer?.(scenarioAccount, optimisticOperation);
|
|
99
|
+
await expectHandler(retry_limit);
|
|
100
|
+
await scenario.afterEach?.(scenarioAccount);
|
|
101
|
+
console.log("After each ✔️");
|
|
102
|
+
console.log(chalk_1.default.green("Transaction:", chalk_1.default.bold(testTransaction.name), "completed ✓"));
|
|
125
103
|
}
|
|
126
|
-
|
|
104
|
+
console.log("\n");
|
|
105
|
+
await scenario.afterAll?.(scenarioAccount);
|
|
106
|
+
console.log("afterAll completed ✓");
|
|
107
|
+
await scenario.teardown?.();
|
|
108
|
+
console.log("\n\n", chalk_1.default.bgGreen.black.bold(" ✧ "), " ", chalk_1.default.green(`Scenario: ${chalk_1.default.italic.bold(scenario.name)}`), " ", chalk_1.default.bgGreen.black.bold(" ✧ "), " → ", chalk_1.default.bold.green(" Completed 🎉"), "\n\n");
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.error("\n\n", chalk_1.default.bgRed.black.bold(" ✧ "), " ", chalk_1.default.red(`Scenario: ${chalk_1.default.italic.bold(scenario.name)}`), " ", chalk_1.default.bgRed.black.bold(" ✧ "), " → ", chalk_1.default.bold.red(" Failed ❌"), "\n\n");
|
|
112
|
+
await scenario.teardown?.();
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
127
115
|
}
|
|
128
116
|
//# sourceMappingURL=main.js.map
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speculos.d.ts","sourceRoot":"","sources":["../../src/signers/speculos.ts"],"names":[],"mappings":"AAMA,OAAO,qBAAqB,MAAM,2CAA2C,CAAC;AAyB9E,wBAAsB,aAAa,CAAC,eAAe,EAAE,IAAI,MAAM,EAAE,GAAG,OAAO,CAAC;IAC1E,SAAS,EAAE,qBAAqB,CAAC;IACjC,yBAAyB,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E,CAAC,CA4ED;AAED,wBAAsB,YAAY,
|
|
1
|
+
{"version":3,"file":"speculos.d.ts","sourceRoot":"","sources":["../../src/signers/speculos.ts"],"names":[],"mappings":"AAMA,OAAO,qBAAqB,MAAM,2CAA2C,CAAC;AAyB9E,wBAAsB,aAAa,CAAC,eAAe,EAAE,IAAI,MAAM,EAAE,GAAG,OAAO,CAAC;IAC1E,SAAS,EAAE,qBAAqB,CAAC;IACjC,yBAAyB,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E,CAAC,CA4ED;AAED,wBAAsB,YAAY,kBAQjC"}
|
package/lib/signers/speculos.js
CHANGED
|
@@ -22,15 +22,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
27
|
};
|
|
@@ -58,86 +49,79 @@ function ensureEnv() {
|
|
|
58
49
|
}
|
|
59
50
|
});
|
|
60
51
|
}
|
|
61
|
-
function spawnSpeculos(nanoAppEndpoint) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
52
|
+
async function spawnSpeculos(nanoAppEndpoint) {
|
|
53
|
+
ensureEnv();
|
|
54
|
+
console.log(`Starting speculos...`);
|
|
55
|
+
try {
|
|
56
|
+
const { data: blob } = await (0, axios_1.default)({
|
|
57
|
+
url: `https://raw.githubusercontent.com/LedgerHQ/coin-apps/master/nanox${nanoAppEndpoint}`,
|
|
58
|
+
method: "GET",
|
|
59
|
+
responseType: "stream",
|
|
60
|
+
headers: {
|
|
61
|
+
Authorization: `Bearer ${process.env.GH_TOKEN}`,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
await promises_1.default.mkdir(path_1.default.resolve(cwd, "tmp"), { recursive: true });
|
|
65
|
+
await promises_1.default.writeFile(path_1.default.resolve(cwd, "tmp/app.elf"), blob, "binary");
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (err instanceof axios_1.AxiosError) {
|
|
69
|
+
throw new Error(`${err.status}: Failed to download the app.elf file from ${nanoAppEndpoint}\nMake sure that your GH_TOKEN is correct and has the right permissions.`);
|
|
76
70
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
await compose.upOne("speculos", {
|
|
74
|
+
cwd,
|
|
75
|
+
log: Boolean(process.env.DEBUG),
|
|
76
|
+
env: process.env,
|
|
77
|
+
});
|
|
78
|
+
async function checkSpeculosLogs() {
|
|
79
|
+
const { out } = await compose.logs("speculos", { cwd, env: process.env });
|
|
80
|
+
if (out.includes("Running on all addresses (0.0.0.0)")) {
|
|
81
|
+
console.log(chalk_1.default.bgYellowBright.black(" - SPECULOS READY ✅ - "));
|
|
82
|
+
return hw_transport_node_speculos_http_1.default.open({
|
|
83
|
+
apiPort: SPECULOS_API_PORT,
|
|
84
|
+
});
|
|
82
85
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
await delay(200);
|
|
87
|
+
return checkSpeculosLogs();
|
|
88
|
+
}
|
|
89
|
+
function getOnSpeculosConfirmation(approvalText = "Accept") {
|
|
90
|
+
async function onSpeculosConfirmation(e) {
|
|
91
|
+
if (e?.type === "device-signature-requested") {
|
|
92
|
+
const { data } = await axios_1.default.get(`http://localhost:${SPECULOS_API_PORT}/events?currentscreenonly=true`);
|
|
93
|
+
if (data.events[0].text !== approvalText) {
|
|
94
|
+
await axios_1.default.post(`http://localhost:${SPECULOS_API_PORT}/button/right`, {
|
|
95
|
+
action: "press-and-release",
|
|
96
|
+
});
|
|
97
|
+
onSpeculosConfirmation(e);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
await axios_1.default.post(`http://localhost:${SPECULOS_API_PORT}/button/both`, {
|
|
101
|
+
action: "press-and-release",
|
|
95
102
|
});
|
|
96
103
|
}
|
|
97
|
-
yield delay(200);
|
|
98
|
-
return checkSpeculosLogs();
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
function getOnSpeculosConfirmation(approvalText = "Accept") {
|
|
102
|
-
function onSpeculosConfirmation(e) {
|
|
103
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
104
|
-
if ((e === null || e === void 0 ? void 0 : e.type) === "device-signature-requested") {
|
|
105
|
-
const { data } = yield axios_1.default.get(`http://localhost:${SPECULOS_API_PORT}/events?currentscreenonly=true`);
|
|
106
|
-
if (data.events[0].text !== approvalText) {
|
|
107
|
-
yield axios_1.default.post(`http://localhost:${SPECULOS_API_PORT}/button/right`, {
|
|
108
|
-
action: "press-and-release",
|
|
109
|
-
});
|
|
110
|
-
onSpeculosConfirmation(e);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
yield axios_1.default.post(`http://localhost:${SPECULOS_API_PORT}/button/both`, {
|
|
114
|
-
action: "press-and-release",
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
104
|
}
|
|
120
|
-
return onSpeculosConfirmation;
|
|
121
105
|
}
|
|
122
|
-
return
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
106
|
+
return onSpeculosConfirmation;
|
|
107
|
+
}
|
|
108
|
+
return checkSpeculosLogs().then(transport => {
|
|
109
|
+
return {
|
|
110
|
+
transport,
|
|
111
|
+
getOnSpeculosConfirmation,
|
|
112
|
+
};
|
|
128
113
|
});
|
|
129
114
|
}
|
|
130
|
-
function killSpeculos() {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
});
|
|
115
|
+
async function killSpeculos() {
|
|
116
|
+
console.log("Stopping speculos...");
|
|
117
|
+
await compose.down({
|
|
118
|
+
cwd,
|
|
119
|
+
log: Boolean(process.env.DEBUG),
|
|
120
|
+
env: process.env,
|
|
121
|
+
commandOptions: ["--remove-orphans"],
|
|
138
122
|
});
|
|
139
123
|
}
|
|
140
|
-
["exit", "SIGINT", "SIGQUIT", "SIGTERM", "SIGUSR1", "SIGUSR2", "uncaughtException"].map(e => process.on(e, () =>
|
|
141
|
-
|
|
142
|
-
}))
|
|
124
|
+
["exit", "SIGINT", "SIGQUIT", "SIGTERM", "SIGUSR1", "SIGUSR2", "uncaughtException"].map(e => process.on(e, async () => {
|
|
125
|
+
await killSpeculos();
|
|
126
|
+
}));
|
|
143
127
|
//# sourceMappingURL=speculos.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speculos.js","sourceRoot":"","sources":["../../src/signers/speculos.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"speculos.js","sourceRoot":"","sources":["../../src/signers/speculos.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,sCA+EC;AAED,oCAQC;AAxHD,gDAAwB;AACxB,kDAA0B;AAC1B,2DAA6B;AAC7B,wDAA0C;AAC1C,+CAA0C;AAE1C,gHAA8E;AAG9E,MAAM,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,GAAU,CAAC;AACjD,MAAM,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEjC,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtF,SAAS,SAAS;IAChB,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,sBAAsB,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAElD,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACb,yCAAyC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAC9F,CAAC;IACJ,CAAC;IAED,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,YAAY,WAAW,0CAA0C,CAAC,CAAC;QAClF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,eAA6B;IAI/D,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,eAAK,EAAC;YACjC,GAAG,EAAE,oEAAoE,eAAe,EAAE;YAC1F,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,QAAQ;YACtB,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;aAChD;SACF,CAAC,CAAC;QAEH,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,kBAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,CAAC,MAAM,8CAA8C,eAAe,0EAA0E,CACrJ,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE;QAC9B,GAAG;QACH,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,KAAK,UAAU,iBAAiB;QAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAE1E,IAAI,GAAG,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,cAAc,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpE,OAAO,yCAAqB,CAAC,IAAI,CAAC;gBAChC,OAAO,EAAE,iBAAiB;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,SAAS,yBAAyB,CAAC,YAAY,GAAG,QAAQ;QACxD,KAAK,UAAU,sBAAsB,CAAC,CAAsB;YAC1D,IAAI,CAAC,EAAE,IAAI,KAAK,4BAA4B,EAAE,CAAC;gBAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAK,CAAC,GAAG,CAC9B,oBAAoB,iBAAiB,gCAAgC,CACtE,CAAC;gBAEF,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACzC,MAAM,eAAK,CAAC,IAAI,CAAC,oBAAoB,iBAAiB,eAAe,EAAE;wBACrE,MAAM,EAAE,mBAAmB;qBAC5B,CAAC,CAAC;oBAEH,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,MAAM,eAAK,CAAC,IAAI,CAAC,oBAAoB,iBAAiB,cAAc,EAAE;wBACpE,MAAM,EAAE,mBAAmB;qBAC5B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,OAAO,iBAAiB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QAC1C,OAAO;YACL,SAAS;YACT,yBAAyB;SAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,MAAM,OAAO,CAAC,IAAI,CAAC;QACjB,GAAG;QACH,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,cAAc,EAAE,CAAC,kBAAkB,CAAC;KACrC,CAAC,CAAC;AACL,CAAC;AAED,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC1F,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;IACvB,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC,CAAC,CACH,CAAC"}
|
package/lib-es/main.js
CHANGED
|
@@ -1,122 +1,110 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import chalk from "chalk";
|
|
11
2
|
import { first, firstValueFrom, map, reduce } from "rxjs";
|
|
12
|
-
export function executeScenario(scenario) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
3
|
+
export async function executeScenario(scenario) {
|
|
4
|
+
try {
|
|
5
|
+
const { accountBridge, currencyBridge, account, retryInterval, retryLimit, onSignerConfirmation, } = await scenario.setup();
|
|
6
|
+
console.log("Setup completed ✓");
|
|
7
|
+
console.log("\n");
|
|
8
|
+
console.log(chalk.bgBlue(" Address "), " → ", chalk.bold.blue(account.freshAddress), "\n\n");
|
|
9
|
+
const data = await currencyBridge.preload(account.currency);
|
|
10
|
+
currencyBridge.hydrate(data, account.currency);
|
|
11
|
+
console.log("Preload + hydrate completed ✓");
|
|
12
|
+
await scenario.beforeSync?.();
|
|
13
|
+
console.log("Running a synchronization on the account...");
|
|
14
|
+
let scenarioAccount = await firstValueFrom(accountBridge
|
|
15
|
+
.sync(account, { paginationConfig: {} })
|
|
16
|
+
.pipe(reduce((acc, f) => f(acc), account)));
|
|
17
|
+
console.log("Synchronization completed ✓");
|
|
18
|
+
await scenario.beforeAll?.(scenarioAccount);
|
|
19
|
+
console.log("BeforeAll completed ✓");
|
|
20
|
+
console.log("\n\n");
|
|
21
|
+
console.log(chalk.bgCyan.black.bold(" ✧ "), " ", chalk.cyan(`Scenario: ${chalk.italic.bold(scenario.name)}`), " ", chalk.bgCyan.black.bold(" ✧ "), " → ", chalk.bold.cyan(" Starting ◌"));
|
|
22
|
+
const scenarioTransactions = scenario.getTransactions(account.freshAddress);
|
|
23
|
+
for (const testTransaction of scenarioTransactions) {
|
|
18
24
|
console.log("\n");
|
|
19
|
-
console.log(chalk.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
25
|
+
console.log(chalk.cyan("Transaction:", chalk.bold(testTransaction.name), "◌"));
|
|
26
|
+
await scenario.beforeEach?.(scenarioAccount);
|
|
27
|
+
console.log("Before each ✔️");
|
|
28
|
+
if (scenarioTransactions.indexOf(testTransaction) > 0) {
|
|
29
|
+
await scenario.beforeSync?.();
|
|
30
|
+
scenarioAccount = await firstValueFrom(accountBridge
|
|
31
|
+
.sync(scenarioAccount, { paginationConfig: {} })
|
|
32
|
+
.pipe(reduce((acc, f) => f(acc), scenarioAccount)));
|
|
33
|
+
}
|
|
34
|
+
const previousAccount = Object.freeze(scenarioAccount);
|
|
35
|
+
const defaultTransaction = accountBridge.createTransaction(scenarioAccount);
|
|
36
|
+
const transaction = await accountBridge.prepareTransaction(scenarioAccount, {
|
|
37
|
+
...defaultTransaction,
|
|
38
|
+
...testTransaction,
|
|
39
|
+
});
|
|
40
|
+
console.log(" → ", "🧑🍳 ", chalk.bold("Prepared the transaction"), "✓");
|
|
41
|
+
const status = await accountBridge.getTransactionStatus(scenarioAccount, transaction);
|
|
42
|
+
if (Object.entries(status.errors).length) {
|
|
43
|
+
throw new Error(`${testTransaction.name} transaction\nError in transaction status: ${JSON.stringify(status.errors, null, 3)}`);
|
|
44
|
+
}
|
|
45
|
+
console.log(" → ", "🪲 ", chalk.bold("No status errors detected"), "✓");
|
|
46
|
+
const { signedOperation } = await firstValueFrom(accountBridge
|
|
47
|
+
.signOperation({
|
|
48
|
+
account: scenarioAccount,
|
|
49
|
+
transaction,
|
|
50
|
+
deviceId: "",
|
|
51
|
+
})
|
|
52
|
+
.pipe(map(e => {
|
|
53
|
+
if (e.type === "device-signature-requested") {
|
|
54
|
+
onSignerConfirmation?.(e);
|
|
44
55
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
return e;
|
|
57
|
+
}), first((e) => e.type === "signed")));
|
|
58
|
+
console.log(" → ", "🔏 ", chalk.bold("Signed the transaction"), "✓");
|
|
59
|
+
const optimisticOperation = await accountBridge.broadcast({
|
|
60
|
+
signedOperation,
|
|
61
|
+
account: scenarioAccount,
|
|
62
|
+
});
|
|
63
|
+
console.log(" → ", "🛫 ", chalk.bold("Broadcasted the transaction"), "✓");
|
|
64
|
+
const retry_limit = retryLimit ?? 10;
|
|
65
|
+
async function expectHandler(retry) {
|
|
66
|
+
await scenario.beforeSync?.();
|
|
67
|
+
scenarioAccount = await firstValueFrom(accountBridge
|
|
68
|
+
.sync({ ...scenarioAccount, pendingOperations: [optimisticOperation] }, { paginationConfig: {} })
|
|
69
|
+
.pipe(reduce((acc, f) => f(acc), scenarioAccount)));
|
|
70
|
+
if (!testTransaction.expect) {
|
|
71
|
+
console.warn(chalk.yellow(`No expects in the transaction ${chalk.bold(testTransaction.name)}. You might want to add tests in this transaction.`));
|
|
72
|
+
return;
|
|
52
73
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if (e.type === "device-signature-requested") {
|
|
62
|
-
onSignerConfirmation === null || onSignerConfirmation === void 0 ? void 0 : onSignerConfirmation(e);
|
|
63
|
-
}
|
|
64
|
-
return e;
|
|
65
|
-
}), first((e) => e.type === "signed")));
|
|
66
|
-
console.log(" → ", "🔏 ", chalk.bold("Signed the transaction"), "✓");
|
|
67
|
-
const optimisticOperation = yield accountBridge.broadcast({
|
|
68
|
-
signedOperation,
|
|
69
|
-
account: scenarioAccount,
|
|
70
|
-
});
|
|
71
|
-
console.log(" → ", "🛫 ", chalk.bold("Broadcasted the transaction"), "✓");
|
|
72
|
-
const retry_limit = retryLimit !== null && retryLimit !== void 0 ? retryLimit : 10;
|
|
73
|
-
function expectHandler(retry) {
|
|
74
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
-
var _a, _b, _c;
|
|
76
|
-
yield ((_a = scenario.beforeSync) === null || _a === void 0 ? void 0 : _a.call(scenario));
|
|
77
|
-
scenarioAccount = yield firstValueFrom(accountBridge
|
|
78
|
-
.sync(Object.assign(Object.assign({}, scenarioAccount), { pendingOperations: [optimisticOperation] }), { paginationConfig: {} })
|
|
79
|
-
.pipe(reduce((acc, f) => f(acc), scenarioAccount)));
|
|
80
|
-
if (!testTransaction.expect) {
|
|
81
|
-
console.warn(chalk.yellow(`No expects in the transaction ${chalk.bold(testTransaction.name)}. You might want to add tests in this transaction.`));
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
try {
|
|
85
|
-
(_b = testTransaction.expect) === null || _b === void 0 ? void 0 : _b.call(testTransaction, previousAccount, scenarioAccount);
|
|
86
|
-
}
|
|
87
|
-
catch (err) {
|
|
88
|
-
if (!((_c = err === null || err === void 0 ? void 0 : err.matcherResult) === null || _c === void 0 ? void 0 : _c.pass)) {
|
|
89
|
-
if (retry === 0) {
|
|
90
|
-
console.error(chalk.red(`Retried ${retry_limit} time(s) and could not assert all expects for transaction ${chalk.bold(testTransaction.name)}`));
|
|
91
|
-
throw err;
|
|
92
|
-
}
|
|
93
|
-
console.warn(chalk.magenta("Test asssertion failed. Retrying..."));
|
|
94
|
-
yield new Promise(resolve => setTimeout(resolve, retryInterval !== null && retryInterval !== void 0 ? retryInterval : 3 * 1000));
|
|
95
|
-
yield expectHandler(retry - 1);
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
throw err;
|
|
99
|
-
}
|
|
74
|
+
try {
|
|
75
|
+
testTransaction.expect?.(previousAccount, scenarioAccount);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
if (!err?.matcherResult?.pass) {
|
|
79
|
+
if (retry === 0) {
|
|
80
|
+
console.error(chalk.red(`Retried ${retry_limit} time(s) and could not assert all expects for transaction ${chalk.bold(testTransaction.name)}`));
|
|
81
|
+
throw err;
|
|
100
82
|
}
|
|
101
|
-
|
|
83
|
+
console.warn(chalk.magenta("Test asssertion failed. Retrying..."));
|
|
84
|
+
await new Promise(resolve => setTimeout(resolve, retryInterval ?? 3 * 1000));
|
|
85
|
+
await expectHandler(retry - 1);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
102
90
|
}
|
|
103
|
-
yield ((_e = scenario.mockIndexer) === null || _e === void 0 ? void 0 : _e.call(scenario, scenarioAccount, optimisticOperation));
|
|
104
|
-
yield expectHandler(retry_limit);
|
|
105
|
-
yield ((_f = scenario.afterEach) === null || _f === void 0 ? void 0 : _f.call(scenario, scenarioAccount));
|
|
106
|
-
console.log("After each ✔️");
|
|
107
|
-
console.log(chalk.green("Transaction:", chalk.bold(testTransaction.name), "completed ✓"));
|
|
108
91
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
console.log(
|
|
114
|
-
}
|
|
115
|
-
catch (err) {
|
|
116
|
-
console.error("\n\n", chalk.bgRed.black.bold(" ✧ "), " ", chalk.red(`Scenario: ${chalk.italic.bold(scenario.name)}`), " ", chalk.bgRed.black.bold(" ✧ "), " → ", chalk.bold.red(" Failed ❌"), "\n\n");
|
|
117
|
-
yield ((_j = scenario.teardown) === null || _j === void 0 ? void 0 : _j.call(scenario));
|
|
118
|
-
throw err;
|
|
92
|
+
await scenario.mockIndexer?.(scenarioAccount, optimisticOperation);
|
|
93
|
+
await expectHandler(retry_limit);
|
|
94
|
+
await scenario.afterEach?.(scenarioAccount);
|
|
95
|
+
console.log("After each ✔️");
|
|
96
|
+
console.log(chalk.green("Transaction:", chalk.bold(testTransaction.name), "completed ✓"));
|
|
119
97
|
}
|
|
120
|
-
|
|
98
|
+
console.log("\n");
|
|
99
|
+
await scenario.afterAll?.(scenarioAccount);
|
|
100
|
+
console.log("afterAll completed ✓");
|
|
101
|
+
await scenario.teardown?.();
|
|
102
|
+
console.log("\n\n", chalk.bgGreen.black.bold(" ✧ "), " ", chalk.green(`Scenario: ${chalk.italic.bold(scenario.name)}`), " ", chalk.bgGreen.black.bold(" ✧ "), " → ", chalk.bold.green(" Completed 🎉"), "\n\n");
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
console.error("\n\n", chalk.bgRed.black.bold(" ✧ "), " ", chalk.red(`Scenario: ${chalk.italic.bold(scenario.name)}`), " ", chalk.bgRed.black.bold(" ✧ "), " → ", chalk.bold.red(" Failed ❌"), "\n\n");
|
|
106
|
+
await scenario.teardown?.();
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
121
109
|
}
|
|
122
110
|
//# sourceMappingURL=main.js.map
|
package/lib-es/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speculos.d.ts","sourceRoot":"","sources":["../../src/signers/speculos.ts"],"names":[],"mappings":"AAMA,OAAO,qBAAqB,MAAM,2CAA2C,CAAC;AAyB9E,wBAAsB,aAAa,CAAC,eAAe,EAAE,IAAI,MAAM,EAAE,GAAG,OAAO,CAAC;IAC1E,SAAS,EAAE,qBAAqB,CAAC;IACjC,yBAAyB,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E,CAAC,CA4ED;AAED,wBAAsB,YAAY,
|
|
1
|
+
{"version":3,"file":"speculos.d.ts","sourceRoot":"","sources":["../../src/signers/speculos.ts"],"names":[],"mappings":"AAMA,OAAO,qBAAqB,MAAM,2CAA2C,CAAC;AAyB9E,wBAAsB,aAAa,CAAC,eAAe,EAAE,IAAI,MAAM,EAAE,GAAG,OAAO,CAAC;IAC1E,SAAS,EAAE,qBAAqB,CAAC;IACjC,yBAAyB,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E,CAAC,CA4ED;AAED,wBAAsB,YAAY,kBAQjC"}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import path from "path";
|
|
11
2
|
import chalk from "chalk";
|
|
12
3
|
import fs from "fs/promises";
|
|
@@ -28,86 +19,79 @@ function ensureEnv() {
|
|
|
28
19
|
}
|
|
29
20
|
});
|
|
30
21
|
}
|
|
31
|
-
export function spawnSpeculos(nanoAppEndpoint) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
22
|
+
export async function spawnSpeculos(nanoAppEndpoint) {
|
|
23
|
+
ensureEnv();
|
|
24
|
+
console.log(`Starting speculos...`);
|
|
25
|
+
try {
|
|
26
|
+
const { data: blob } = await axios({
|
|
27
|
+
url: `https://raw.githubusercontent.com/LedgerHQ/coin-apps/master/nanox${nanoAppEndpoint}`,
|
|
28
|
+
method: "GET",
|
|
29
|
+
responseType: "stream",
|
|
30
|
+
headers: {
|
|
31
|
+
Authorization: `Bearer ${process.env.GH_TOKEN}`,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
await fs.mkdir(path.resolve(cwd, "tmp"), { recursive: true });
|
|
35
|
+
await fs.writeFile(path.resolve(cwd, "tmp/app.elf"), blob, "binary");
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err instanceof AxiosError) {
|
|
39
|
+
throw new Error(`${err.status}: Failed to download the app.elf file from ${nanoAppEndpoint}\nMake sure that your GH_TOKEN is correct and has the right permissions.`);
|
|
46
40
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
await compose.upOne("speculos", {
|
|
44
|
+
cwd,
|
|
45
|
+
log: Boolean(process.env.DEBUG),
|
|
46
|
+
env: process.env,
|
|
47
|
+
});
|
|
48
|
+
async function checkSpeculosLogs() {
|
|
49
|
+
const { out } = await compose.logs("speculos", { cwd, env: process.env });
|
|
50
|
+
if (out.includes("Running on all addresses (0.0.0.0)")) {
|
|
51
|
+
console.log(chalk.bgYellowBright.black(" - SPECULOS READY ✅ - "));
|
|
52
|
+
return SpeculosTransportHttp.open({
|
|
53
|
+
apiPort: SPECULOS_API_PORT,
|
|
54
|
+
});
|
|
52
55
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
56
|
+
await delay(200);
|
|
57
|
+
return checkSpeculosLogs();
|
|
58
|
+
}
|
|
59
|
+
function getOnSpeculosConfirmation(approvalText = "Accept") {
|
|
60
|
+
async function onSpeculosConfirmation(e) {
|
|
61
|
+
if (e?.type === "device-signature-requested") {
|
|
62
|
+
const { data } = await axios.get(`http://localhost:${SPECULOS_API_PORT}/events?currentscreenonly=true`);
|
|
63
|
+
if (data.events[0].text !== approvalText) {
|
|
64
|
+
await axios.post(`http://localhost:${SPECULOS_API_PORT}/button/right`, {
|
|
65
|
+
action: "press-and-release",
|
|
66
|
+
});
|
|
67
|
+
onSpeculosConfirmation(e);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
await axios.post(`http://localhost:${SPECULOS_API_PORT}/button/both`, {
|
|
71
|
+
action: "press-and-release",
|
|
65
72
|
});
|
|
66
73
|
}
|
|
67
|
-
yield delay(200);
|
|
68
|
-
return checkSpeculosLogs();
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
function getOnSpeculosConfirmation(approvalText = "Accept") {
|
|
72
|
-
function onSpeculosConfirmation(e) {
|
|
73
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
-
if ((e === null || e === void 0 ? void 0 : e.type) === "device-signature-requested") {
|
|
75
|
-
const { data } = yield axios.get(`http://localhost:${SPECULOS_API_PORT}/events?currentscreenonly=true`);
|
|
76
|
-
if (data.events[0].text !== approvalText) {
|
|
77
|
-
yield axios.post(`http://localhost:${SPECULOS_API_PORT}/button/right`, {
|
|
78
|
-
action: "press-and-release",
|
|
79
|
-
});
|
|
80
|
-
onSpeculosConfirmation(e);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
yield axios.post(`http://localhost:${SPECULOS_API_PORT}/button/both`, {
|
|
84
|
-
action: "press-and-release",
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
74
|
}
|
|
90
|
-
return onSpeculosConfirmation;
|
|
91
75
|
}
|
|
92
|
-
return
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
76
|
+
return onSpeculosConfirmation;
|
|
77
|
+
}
|
|
78
|
+
return checkSpeculosLogs().then(transport => {
|
|
79
|
+
return {
|
|
80
|
+
transport,
|
|
81
|
+
getOnSpeculosConfirmation,
|
|
82
|
+
};
|
|
98
83
|
});
|
|
99
84
|
}
|
|
100
|
-
export function killSpeculos() {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
85
|
+
export async function killSpeculos() {
|
|
86
|
+
console.log("Stopping speculos...");
|
|
87
|
+
await compose.down({
|
|
88
|
+
cwd,
|
|
89
|
+
log: Boolean(process.env.DEBUG),
|
|
90
|
+
env: process.env,
|
|
91
|
+
commandOptions: ["--remove-orphans"],
|
|
108
92
|
});
|
|
109
93
|
}
|
|
110
|
-
["exit", "SIGINT", "SIGQUIT", "SIGTERM", "SIGUSR1", "SIGUSR2", "uncaughtException"].map(e => process.on(e, () =>
|
|
111
|
-
|
|
112
|
-
}))
|
|
94
|
+
["exit", "SIGINT", "SIGQUIT", "SIGTERM", "SIGUSR1", "SIGUSR2", "uncaughtException"].map(e => process.on(e, async () => {
|
|
95
|
+
await killSpeculos();
|
|
96
|
+
}));
|
|
113
97
|
//# sourceMappingURL=speculos.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speculos.js","sourceRoot":"","sources":["../../src/signers/speculos.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"speculos.js","sourceRoot":"","sources":["../../src/signers/speculos.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/coin-tester",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0-next.0",
|
|
4
4
|
"description": "Deterministic testing of Ledger coin-modules",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"dependencies": {
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"@types/jest": "^28.1.8",
|
|
16
|
-
"@types/node": "^
|
|
16
|
+
"@types/node": "^22.10.10",
|
|
17
17
|
"jest": "^28.1.3",
|
|
18
18
|
"ts-jest": "^28.0.8",
|
|
19
19
|
"typescript": "^5.1.3",
|
|
20
|
-
"@ledgerhq/types-cryptoassets": "^7.
|
|
21
|
-
"@ledgerhq/types-live": "^6.
|
|
20
|
+
"@ledgerhq/types-cryptoassets": "^7.19.0",
|
|
21
|
+
"@ledgerhq/types-live": "^6.60.0-next.0"
|
|
22
22
|
},
|
|
23
23
|
"typesVersions": {
|
|
24
24
|
"*": {
|
|
@@ -59,10 +59,10 @@
|
|
|
59
59
|
"homepage": "https://github.com/LedgerHQ/ledger-live/tree/develop/libs/coin-tester",
|
|
60
60
|
"scripts": {
|
|
61
61
|
"clean": "rimraf lib lib-es",
|
|
62
|
-
"build": "tsc && tsc -m
|
|
62
|
+
"build": "tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es",
|
|
63
63
|
"prewatch": "pnpm build",
|
|
64
64
|
"watch": "tsc --watch",
|
|
65
|
-
"watch:es": "tsc --watch -m
|
|
65
|
+
"watch:es": "tsc --watch -m esnext --moduleResolution bundler --outDir lib-es",
|
|
66
66
|
"lint": "eslint .",
|
|
67
67
|
"lint:fix": "pnpm lint --fix"
|
|
68
68
|
}
|
package/src/main.ts
CHANGED
|
@@ -133,7 +133,7 @@ export async function executeScenario<T extends TransactionCommon, A extends Acc
|
|
|
133
133
|
);
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
console.log(" → ", "🪲
|
|
136
|
+
console.log(" → ", "🪲 ", chalk.bold("No status errors detected"), "✓");
|
|
137
137
|
|
|
138
138
|
const { signedOperation } = await firstValueFrom(
|
|
139
139
|
accountBridge
|
package/src/signers/speculos.ts
CHANGED