Skip to content

Commit c9da86e

Browse files
authored
Merge pull request #192 from Jayrodri088/feat-multi-device-passkey
feat(wallet): add multi-device passkey signer management flow
2 parents 84c9723 + 55c12ac commit c9da86e

11 files changed

Lines changed: 263 additions & 99 deletions

File tree

.github/workflows/ci.yml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,18 @@ jobs:
121121
- name: Coverage threshold check
122122
working-directory: packages/core/${{ matrix.package }}
123123
run: |
124-
COVERAGE=$(cat coverage/coverage-summary.json | jq '.total.lines.pct')
125-
echo "Coverage: $COVERAGE%"
126-
if (( $(echo "$COVERAGE < 90" | bc -l) )); then
127-
echo "❌ Coverage is below 90%"
124+
SUMMARY="coverage/coverage-summary.json"
125+
if [ ! -f "$SUMMARY" ]; then
126+
echo "❌ $SUMMARY missing — ensure Jest uses coverageReporters including json-summary"
128127
exit 1
129128
fi
129+
COVERAGE=$(jq -r '.total.lines.pct' "$SUMMARY")
130+
echo "Coverage: $COVERAGE%"
131+
node -e "
132+
const c = parseFloat(process.argv[1]);
133+
if (Number.isNaN(c)) { console.error('Invalid coverage value'); process.exit(1); }
134+
if (c < 90) { console.error('Coverage is below 90%'); process.exit(1); }
135+
" "$COVERAGE"
130136
echo "✅ Coverage is above 90%"
131137
132138
# Job 4: Security audit

jest.config.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ const tsJestTransformCfg = createDefaultPreset().transform;
55
/** @type {import("jest").Config} **/
66
module.exports = {
77
testEnvironment: "node",
8+
testPathIgnorePatterns: [
9+
"/node_modules/",
10+
"\\.e2e\\.test\\.[jt]sx?$",
11+
"MockLedgerTransport\\.ts$",
12+
// Jest matches **/__tests__/**/*.ts — exclude helpers and mocks
13+
"[/\\\\]__tests__[/\\\\]__mocks__[/\\\\]",
14+
"[/\\\\]__tests__[/\\\\]setup\\.ts$",
15+
],
816
transform: {
917
...tsJestTransformCfg,
1018
},

package-lock.json

Lines changed: 16 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
},
7171
"overrides": {
7272
"diff": "^8.0.1",
73+
"handlebars": "4.7.9",
7374
"tar": "^7.5.7",
7475
"xml2js": "^0.6.0",
7576
"blessed-contrib": "^4.11.0"

packages/core/defi-protocols/jest.config.cjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ module.exports = {
2020
},
2121
},
2222
coverageDirectory: 'coverage',
23+
// CI reads coverage-summary.json (see .github/workflows/ci.yml)
24+
coverageReporters: ['text', 'lcov', 'json', 'json-summary'],
2325
verbose: true,
2426
transform: {
2527
'^.+\\.ts$': ['ts-jest', {

packages/core/defi-protocols/tsconfig.tsbuildinfo

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/core/oracles/tsconfig.tsbuildinfo

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/core/stellar-sdk/tsconfig.tsbuildinfo

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/core/wallet/auth/src/hardware/__tests__/LedgerWallet.test.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,16 +177,8 @@ describe('LedgerWallet', () => {
177177
});
178178

179179
describe('Event Emitter', () => {
180-
it('should emit error events', (done) => {
181-
ledgerWallet.on('error', (error) => {
182-
expect(error).toBeInstanceOf(LedgerError);
183-
done();
184-
});
185-
186-
// Trigger error by trying to get public key without connection
187-
ledgerWallet.getPublicKey().catch(() => {
188-
// Expected to fail
189-
});
180+
it('should reject getPublicKey with LedgerError when not connected', async () => {
181+
await expect(ledgerWallet.getPublicKey()).rejects.toThrow(LedgerError);
190182
});
191183

192184
it('should emit disconnected event', (done) => {

packages/core/wallet/auth/src/hardware/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,16 @@ export function buildStellarPath(accountIndex: number = 0): string {
153153
return `44'/148'/${accountIndex}'`;
154154
}
155155

156+
/** Canonical hardened BIP44 path for Stellar (slashes + `'` markers). */
157+
const STELLAR_BIP44_PATH_REGEX = /^44'\/148'\/[0-9]+'$/;
158+
156159
/**
157160
* Validate BIP44 derivation path for Stellar
158161
*/
159162
export function validateStellarPath(path: string): boolean {
163+
if (!STELLAR_BIP44_PATH_REGEX.test(path)) {
164+
return false;
165+
}
160166
try {
161167
const parsed = parseBIP44Path(path);
162168
return parsed.purpose === 44 && parsed.coinType === STELLAR_COIN_TYPE;

0 commit comments

Comments
 (0)