Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"@canton-network/core-ledger-proto": "^0.6.0",
"@cypherock/sdk-app-btc": "workspace:^",
"@cypherock/sdk-app-canton": "workspace:^",
"@cypherock/sdk-app-cardano": "workspace:^",
"@cypherock/sdk-app-constellation": "workspace:^",
"@cypherock/sdk-app-evm": "workspace:^",
"@cypherock/sdk-app-icp": "workspace:^",
Expand Down
8 changes: 8 additions & 0 deletions packages/app-cardano/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = {
root: true,
extends: ['@cypherock/eslint-config'],
parserOptions: {
tsconfigRootDir: __dirname,
project: ['./tsconfig.eslint.json'],
},
};
7 changes: 7 additions & 0 deletions packages/app-cardano/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.turbo
dist

# stryker temp files
.stryker-tmp
reports
src/proto
1 change: 1 addition & 0 deletions packages/app-cardano/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
src/proto/generated
1 change: 1 addition & 0 deletions packages/app-cardano/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"@cypherock/prettier-config"
3 changes: 3 additions & 0 deletions packages/app-cardano/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# @cypherock/sdk-app-cardano

## 1.0.0
3 changes: 3 additions & 0 deletions packages/app-cardano/docs/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Introduction

Documentation pending
22 changes: 22 additions & 0 deletions packages/app-cardano/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module.exports = {
collectCoverage: true,
collectCoverageFrom: [
'src/**/*.ts',
'!src/**/*.test.ts',
'!src/**/__fixtures__/*',
'!src/proto/generated/**/*',
],
testTimeout: 500,
preset: 'ts-jest',
testEnvironment: 'node',
rootDir: '.',
testPathIgnorePatterns: ['/node_modules/', '/__fixtures__/', '/dist/'],
testMatch: [
'**/tests/**/*.[jt]s?(x)',
'**/__tests__/**/*.[jt]s?(x)',
'!**/__mocks__/**/*.[jt]s?(x)',
'!**/__helpers__/**/*.[jt]s?(x)',
'!**/.stryker-tmp/**/*.[jt]s?(x)',
],
modulePathIgnorePatterns: ['<rootDir>/.stryker-tmp'],
};
21 changes: 21 additions & 0 deletions packages/app-cardano/jest.stryker.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module.exports = {
collectCoverage: true,
collectCoverageFrom: [
'src/**/*.ts',
'!src/**/*.test.ts',
'!src/**/__fixtures__/*',
'!src/proto/generated/**/*',
],
testTimeout: 500,
preset: 'ts-jest',
testEnvironment: 'node',
rootDir: '.',
testPathIgnorePatterns: ['/node_modules/', '/__fixtures__/', '/dist/'],
testMatch: [
'**/tests/**/*.[jt]s?(x)',
'**/__tests__/**/*.[jt]s?(x)',
'!**/__mocks__/**/*.[jt]s?(x)',
'!**/__helpers__/**/*.[jt]s?(x)',
],
modulePathIgnorePatterns: ['<rootDir>/.stryker-tmp'],
};
1 change: 1 addition & 0 deletions packages/app-cardano/mkdocs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
site_name: '@cypherock/sdk-app-cardano'
53 changes: 53 additions & 0 deletions packages/app-cardano/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{
"name": "@cypherock/sdk-app-cardano",
"version": "1.0.1",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"license": "MIT",
"scripts": {
"lint": "eslint src/ tests/ --fix",
"lint:check": "eslint --ext .ts,tsx,js,jsx,js src/",
"pretty": "prettier --write 'src/**/*.ts' 'tests/**/*.ts'",
"pretty:check": "prettier --check 'src/**/*.ts' 'tests/**/*.ts'",
"prebuild": "bash ./scripts/prebuild.sh",
"build": "rimraf dist && tsc -p tsconfig.json",
"test": "cross-env LOG_LEVEL=error jest",
"test:mutation": "stryker run",
"pre-commit": "lint-staged"
},
"devDependencies": {
"@cypherock/eslint-config": "workspace:*",
"@cypherock/prettier-config": "workspace:^0.0.8",
"@cypherock/tsconfig": "workspace:*",
"@jest/globals": "^29.4.1",
"@stryker-mutator/core": "^6.4.1",
"@stryker-mutator/jest-runner": "^6.4.1",
"@stryker-mutator/typescript-checker": "^6.4.1",
"@types/jest": "^29.4.0",
"@types/node": "18.11.18",
"cross-env": "^7.0.3",
"eslint": "^7.32.0",
"jest": "^29.4.1",
"lint-staged": "^13.2.0",
"rimraf": "^4.1.2",
"ts-jest": "^29.0.5",
"ts-proto": "^1.139.0",
"typescript": "^4.5.2"
},
"dependencies": {
"@cypherock/sdk-core": "workspace:^0.1.2",
"@cypherock/sdk-interfaces": "workspace:^0.0.16",
"@cypherock/sdk-utils": "workspace:^0.0.21",
"long": "^5.2.1",
"protobufjs": "^7.2.2"
},
"lint-staged": {
"*.{ts,tsx}": [
"eslint --ext ts,tsx --quiet --fix --",
"prettier --write"
],
"*.{js,jsx,md,mdx,mjs,yml,yaml,css,json}": [
"prettier --write"
]
}
}
16 changes: 16 additions & 0 deletions packages/app-cardano/scripts/prebuild.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/bin/bash

set -e

rm -rf ./src/proto/generated/*.ts || true
rm -rf ./src/proto/generated/cardano || true

mkdir -p src/proto/generated

if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]]; then
protoc --plugin=protoc-gen-ts_proto=$(pwd)/node_modules/.bin/protoc-gen-ts_proto.cmd --ts_proto_out=./src/proto/generated ../../submodules/common/proto/cardano/*.proto ../../submodules/common/proto/common.proto -I../../submodules/common/proto --ts_proto_opt=forceLong=string --ts_proto_opt=esModuleInterop=true
else
protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./src/proto/generated ../../submodules/common/proto/cardano/*.proto ../../submodules/common/proto/common.proto -I../../submodules/common/proto --ts_proto_opt=forceLong=string --ts_proto_opt=esModuleInterop=true
fi

node ../../scripts/extractTypes/index.js ./src/proto/generated ./src/proto/generated/types.ts
60 changes: 60 additions & 0 deletions packages/app-cardano/src/__mocks__/sdk.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { ISDK } from '@cypherock/sdk-core';
import { DeviceState } from '@cypherock/sdk-interfaces';
import { jest } from '@jest/globals';

let sequenceNumber = 0;

export const getStatus = jest.fn<ISDK['getStatus']>();
export const sendAbort = jest.fn<ISDK['sendAbort']>();
export const getResult = jest.fn<ISDK['getResult']>();
export const sendQuery = jest.fn<ISDK['sendQuery']>();

export const configureAppletId = jest.fn<ISDK['configureAppletId']>();
export const checkAppCompatibility = jest.fn<ISDK['checkAppCompatibility']>();

export const waitForResult = jest.fn<ISDK['waitForResult']>();
export const getSequenceNumber = jest.fn<ISDK['getSequenceNumber']>(
async () => sequenceNumber,
);
export const getNewSequenceNumber = jest.fn<ISDK['getNewSequenceNumber']>(
async () => {
sequenceNumber += 1;
return sequenceNumber;
},
);

export const runOperation = jest.fn<ISDK['runOperation']>(func => func());

export const destroy = jest.fn<ISDK['destroy']>();
export const getDeviceState = jest.fn<ISDK['getDeviceState']>(
async () => DeviceState.MAIN,
);

export const create = jest.fn(async () =>
Promise.resolve({
configureAppletId,
checkAppCompatibility,
sendAbort,
getResult,
getStatus,
sendQuery,
waitForResult,
getSequenceNumber,
getNewSequenceNumber,
runOperation,
destroy,
getDeviceState,
}),
);

jest.mock('@cypherock/sdk-core', () => {
const originalModule: any = jest.requireActual('@cypherock/sdk-core');

return {
__esModule: true,
...originalModule,
SDK: {
create,
},
};
});
45 changes: 45 additions & 0 deletions packages/app-cardano/src/app.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { IDeviceConnection } from '@cypherock/sdk-interfaces';
import { SDK } from '@cypherock/sdk-core';

import * as operations from './operations';

export class CardanoApp {
private readonly sdk: SDK;

public static readonly APPLET_ID = 28;

private constructor(sdk: SDK) {
this.sdk = sdk;
}

public static async create(connection: IDeviceConnection) {
const sdk = await SDK.create(connection, CardanoApp.APPLET_ID);
return new CardanoApp(sdk);
}

public async getPublicKeys(params: operations.IGetPublicKeysParams) {
return this.sdk.runOperation(() =>
operations.getPublicKeys(this.sdk, params),
);
}

public async getUserVerifiedPublicKey(
params: operations.IGetUserVerifiedPublicKeyParams,
) {
return this.sdk.runOperation(() =>
operations.getUserVerifiedPublicKey(this.sdk, params),
);
}

public async signTxn(params: operations.ISignTxnParams) {
return this.sdk.runOperation(() => operations.signTxn(this.sdk, params));
}

public async destroy() {
return this.sdk.destroy();
}

public async abort() {
await this.sdk.sendAbort();
}
}
4 changes: 4 additions & 0 deletions packages/app-cardano/src/constants/appId.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const APP_VERSION = {
from: '1.0.0',
to: '2.0.0',
};
7 changes: 7 additions & 0 deletions packages/app-cardano/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export * from './app';
export * from './types';
export {
updateLogger,
derivePaymentAddress,
deriveStakeAddress,
} from './utils';
59 changes: 59 additions & 0 deletions packages/app-cardano/src/operations/getPublicKeys/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { ISDK } from '@cypherock/sdk-core';
import {
createStatusListener,
assert,
createLoggerWithPrefix,
} from '@cypherock/sdk-utils';
import { APP_VERSION } from '../../constants/appId';
import {
GetPublicKeysStatus,
SeedGenerationStatus,
} from '../../proto/generated/types';
import { OperationHelper, logger as rootLogger } from '../../utils';
import { runGetPublicKeysOnDevice } from '../runGetPublicKeys';
import {
IGetPublicKeysParams,
IGetPublicKeysResult,
GetPublicKeysEvent,
} from '../types';

const logger = createLoggerWithPrefix(rootLogger, 'GetPublicKeys');

export const getPublicKeys = async (
sdk: ISDK,
params: IGetPublicKeysParams,
): Promise<IGetPublicKeysResult> => {
assert(params, 'Params should be defined');
assert(params.walletId, 'walletId should be defined');
assert(params.derivationPaths, 'derivationPaths should be defined');
assert(
params.derivationPaths.length > 0,
'derivationPaths should not be empty',
);
assert(
params.derivationPaths.reduce(
(acc, path) => acc && path.path.length === 5,
true,
),
'derivationPaths should be equal to 5',
);

await sdk.checkAppCompatibility(APP_VERSION);

const { onStatus, forceStatusUpdate } = createStatusListener({
enums: GetPublicKeysEvent,
operationEnums: GetPublicKeysStatus,
seedGenerationEnums: SeedGenerationStatus,
onEvent: params.onEvent,
logger,
});

const helper = new OperationHelper({
sdk,
queryKey: 'getPublicKeys',
resultKey: 'getPublicKeys',
onStatus,
});

return runGetPublicKeysOnDevice(helper, params, forceStatusUpdate);
};
Loading
Loading