Skip to content

Commit

Permalink
chore: define cardano in its own module
Browse files Browse the repository at this point in the history
Signed-off-by: Stéphane Prohaszka <stephane.prohaszka@ledger.fr>
  • Loading branch information
sprohaszka-ledger committed May 6, 2024
1 parent 5d18b4f commit 00de9c9
Show file tree
Hide file tree
Showing 82 changed files with 1,448 additions and 1,207 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import GenericStepConnectDevice from "~/renderer/modals/Send/steps/GenericStepCo
import StepConfirmation, { StepConfirmationFooter } from "./steps/StepConfirmation";
import { CardanoAccount } from "@ledgerhq/live-common/families/cardano/types";
import { TFunction } from "i18next";
import { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import { StakePool } from "@ledgerhq/live-common/families/cardano/staking";

type OwnProps = {
stepId: StepId;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import { LEDGER_POOL_IDS, StakePool } from "@ledgerhq/live-common/families/cardano/staking";
import React from "react";
import { IconContainer } from "~/renderer/components/Delegation/ValidatorRow";
import LedgerLiveLogo from "~/renderer/components/LedgerLiveLogo";
import Logo from "~/renderer/icons/Logo";
import FirstLetterIcon from "~/renderer/components/FirstLetterIcon";
import { LEDGER_POOL_IDS } from "@ledgerhq/live-common/families/cardano/utils";

const CardanoLedgerPoolIcon = ({ validator }: { validator: StakePool }) => {
return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useCallback, useState, useRef, memo, useEffect } from "react";
import debounce from "lodash/debounce";
import { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import { StakePool } from "@ledgerhq/live-common/families/cardano/staking";
import styled from "styled-components";
import Box from "~/renderer/components/Box";
import BigSpinner from "~/renderer/components/BigSpinner";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ import IconAngleDown from "~/renderer/icons/AngleDown";
import ValidatorRow from "./ValidatorRow";
import { Account } from "@ledgerhq/types-live";
import { TransactionStatus } from "@ledgerhq/live-common/generated/types";
import { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import {
LEDGER_POOL_IDS,
StakePool,
fetchPoolDetails,
} from "@ledgerhq/live-common/families/cardano/staking";
import { useCardanoFamilyPools } from "@ledgerhq/live-common/families/cardano/react";
import { fetchPoolDetails } from "@ledgerhq/live-common/families/cardano/api/getPools";
import ValidatorSearchInput from "~/renderer/components/Delegation/ValidatorSearchInput";
import { LEDGER_POOL_IDS } from "@ledgerhq/live-common/families/cardano/utils";
import { CardanoDelegation } from "@ledgerhq/live-common/families/cardano/types";
import BigSpinner from "~/renderer/components/BigSpinner";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import Text from "~/renderer/components/Text";
import Check from "~/renderer/icons/Check";
import { openURL } from "~/renderer/linking";
import LedgerPoolIcon from "../LedgerPoolIcon";
import { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import { StakePool } from "@ledgerhq/live-common/families/cardano/staking";

type Props = {
currency: CryptoCurrency;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import Box from "~/renderer/components/Box";
import Button from "~/renderer/components/Button";
import { AccountBridge } from "@ledgerhq/types-live";
import { Transaction as CardanoTransaction } from "@ledgerhq/live-common/families/cardano/types";
import { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import { StakePool } from "@ledgerhq/live-common/families/cardano/staking";
import ValidatorField from "../fields/ValidatorField";
import ErrorBanner from "~/renderer/components/ErrorBanner";
import AccountFooter from "~/renderer/modals/Send/AccountFooter";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
Transaction,
TransactionStatus,
} from "@ledgerhq/live-common/families/cardano/types";
import { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import { StakePool } from "@ledgerhq/live-common/families/cardano/staking";

export type StepId = "validator" | "summary" | "connectDevice" | "confirmation";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/accoun
import { getAccountBridge } from "@ledgerhq/live-common/bridge/index";
import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction";
import { formatCurrencyUnit, getCurrencyColor } from "@ledgerhq/live-common/currencies/index";
import type {
APIGetPoolsDetail,
StakePool,
} from "@ledgerhq/live-common/families/cardano/api/api-types";
import {
LEDGER_POOL_IDS,
fetchPoolDetails,
type APIGetPoolsDetail,
type StakePool,
} from "@ledgerhq/live-common/families/cardano/staking";
import type {
CardanoAccount,
CardanoDelegation,
TransactionStatus,
} from "@ledgerhq/live-common/families/cardano/types";
import { LEDGER_POOL_IDS } from "@ledgerhq/live-common/families/cardano/utils";
import { fetchPoolDetails } from "@ledgerhq/live-common/families/cardano/api/getPools";
import { Box, Text } from "@ledgerhq/native-ui";
import { AccountLike } from "@ledgerhq/types-live";
import { TransactionStatus } from "@ledgerhq/live-common/families/cardano/types";
import Button from "~/components/Button";
import Skeleton from "~/components/Skeleton";
import Circle from "~/components/Circle";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import invariant from "invariant";
import React, { useCallback } from "react";
import { FlatList, StyleSheet, View, SafeAreaView } from "react-native";
import { useSelector } from "react-redux";
import type { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import type { StakePool } from "@ledgerhq/live-common/families/cardano/staking";
import { useCardanoFamilyPools } from "@ledgerhq/live-common/families/cardano/react";
import { TrackScreen } from "~/analytics";
import { ScreenName } from "~/const";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Transaction, TransactionStatus } from "@ledgerhq/live-common/families/cardano/types";
import type { Operation } from "@ledgerhq/types-live";
import type { Device } from "@ledgerhq/live-common/hw/actions/types";
import type { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import type { StakePool } from "@ledgerhq/live-common/families/cardano/staking";
import { ScreenName } from "~/const";

export type CardanoDelegationFlowParamList = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useTranslation } from "react-i18next";
import { useTheme } from "@react-navigation/native";
import { Text } from "@ledgerhq/native-ui";
import type { CardanoDelegation } from "@ledgerhq/live-common/families/cardano/types";
import { LEDGER_POOL_IDS } from "@ledgerhq/live-common/families/cardano/utils";
import { LEDGER_POOL_IDS } from "@ledgerhq/live-common/families/cardano/staking";
import { Currency, Unit } from "@ledgerhq/types-cryptoassets";
import CounterValue from "~/components/CounterValue";
import ArrowRight from "~/icons/ArrowRight";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import type {
CardanoAccount,
CardanoDelegation,
} from "@ledgerhq/live-common/families/cardano/types";
import { LEDGER_POOL_IDS } from "@ledgerhq/live-common/families/cardano/utils";
import { LEDGER_POOL_IDS } from "@ledgerhq/live-common/families/cardano/staking";
import { getDefaultExplorerView, getStakePoolExplorer } from "@ledgerhq/live-common/explorers";

import { StackNavigationProp } from "@react-navigation/stack";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useCallback } from "react";
import { Trans } from "react-i18next";
import { StyleSheet, View } from "react-native";
import type { StakePool } from "@ledgerhq/live-common/families/cardano/api/api-types";
import type { StakePool } from "@ledgerhq/live-common/families/cardano/staking";
import { Text } from "@ledgerhq/native-ui";
import Touchable from "~/components/Touchable";
import PoolImage from "./PoolImage";
Expand Down
20 changes: 20 additions & 0 deletions libs/coin-modules/coin-cardano/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module.exports = {
env: {
browser: true,
es6: true,
},
overrides: [
{
files: ["src/**/*.test.{ts,tsx}"],
env: {
"jest/globals": true,
},
plugins: ["jest"],
},
],
rules: {
"no-console": ["error", { allow: ["warn", "error"] }],
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-explicit-any": "warn",
},
};
6 changes: 6 additions & 0 deletions libs/coin-modules/coin-cardano/.unimportedrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"entry": [
"src/bridge/js.ts"
],
"ignoreUnimported": []
}
6 changes: 6 additions & 0 deletions libs/coin-modules/coin-cardano/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
testPathIgnorePatterns: ["lib/", "lib-es/"],
};
85 changes: 85 additions & 0 deletions libs/coin-modules/coin-cardano/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
{
"name": "@ledgerhq/coin-cardano",
"version": "0.0.1",
"description": "Ledger Cardano Coin integration",
"keywords": [
"Ledger",
"LedgerWallet",
"ada",
"Cardano",
"Hardware Wallet"
],
"repository": {
"type": "git",
"url": "https://github.com/LedgerHQ/ledger-live.git"
},
"bugs": {
"url": "https://github.com/LedgerHQ/ledger-live/issues"
},
"homepage": "https://github.com/LedgerHQ/ledger-live/tree/develop/libs/coin-modules/coin-cardano",
"publishConfig": {
"access": "public"
},
"typesVersions": {
"*": {
"lib/*": [
"lib/*"
],
"lib-es/*": [
"lib-es/*"
],
"*": [
"lib/*"
]
}
},
"exports": {
"./lib/*": "./lib/*.js",
"./lib-es/*": "./lib-es/*.js",
"./*": {
"require": "./lib/*.js",
"default": "./lib-es/*.js"
},
"./package.json": "./package.json"
},
"license": "Apache-2.0",
"dependencies": {
"@ledgerhq/coin-framework": "workspace:^",
"@ledgerhq/cryptoassets": "workspace:^",
"@ledgerhq/devices": "workspace:^",
"@ledgerhq/errors": "workspace:^",
"@ledgerhq/live-config": "workspace:^",
"@ledgerhq/live-env": "workspace:^",
"@ledgerhq/live-network": "workspace:^",
"@ledgerhq/live-promise": "workspace:^",
"@ledgerhq/logs": "workspace:^",
"@ledgerhq/types-cryptoassets": "workspace:^",
"@ledgerhq/types-live": "workspace:^",
"@stricahq/bip32ed25519": "^1.0.3",
"@stricahq/typhonjs": "^1.2.6",
"bech32": "^1.1.3",
"bignumber.js": "^9.1.2",
"expect": "^27.4.6",
"invariant": "^2.2.2",
"lodash": "^4.17.21",
"rxjs": "^7.8.1"
},
"devDependencies": {
"@types/invariant": "^2.2.2",
"@types/jest": "^29.5.10",
"@types/lodash": "^4.14.191",
"jest": "^29.7.0",
"ts-jest": "^29.1.1"
},
"scripts": {
"clean": "rimraf lib lib-es",
"build": "tsc && tsc -m ES6 --outDir lib-es",
"prewatch": "pnpm build",
"watch": "tsc --watch",
"doc": "documentation readme src/** --section=API --pe ts --re ts --re d.ts",
"lint": "eslint ./src --no-error-on-unmatched-pattern --ext .ts,.tsx --cache",
"lint:fix": "pnpm lint --fix",
"test": "jest",
"unimported": "unimported"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import invariant from "invariant";
import { getAccountUnit } from "../../account";
import { formatCurrencyUnit } from "../../currencies";
import { getAccountUnit } from "@ledgerhq/coin-framework/account/index";
import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index";
import { CardanoAccount } from "./types";

export function formatAccountSpecifics(account: CardanoAccount): string {
Expand Down
114 changes: 114 additions & 0 deletions libs/coin-modules/coin-cardano/src/bridge.integration.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import "../../__tests__/test-helpers/setup";
import BigNumber from "bignumber.js";
import { cardanoRawAccount1 } from "./datasets/rawAccount.1";
import { cardanoScanAccounts } from "./datasets/scanAccounts";
import { CardanoInvalidPoolId, CardanoMinAmountError } from "./errors";
import { fromTransactionRaw } from "./transaction";
import type { Transaction } from "./types";
import type { DatasetTest } from "@ledgerhq/types-live";

export const dataset: DatasetTest<Transaction> = {
implementations: ["js"],
currencies: {
cardano_testnet: {
scanAccounts: cardanoScanAccounts,
accounts: [
{
raw: cardanoRawAccount1,
transactions: [
{
name: "amount less then minimum",
transaction: fromTransactionRaw({
family: "cardano",
recipient:
"addr_test1qpl90kc2jl5kr9tev0s7vays9yhwcdnq8nlylyk4dqsdq3g466elxnxwrzwq72pvp5akenj30t5s9et7frfvrxxx8xcsxrzs87",
amount: "0.1",
mode: "send",
poolId: undefined,
}),
expectedStatus: {
amount: new BigNumber("0.1"),
errors: {
amount: new CardanoMinAmountError(),
},
},
},
/* // FIXME broken test
{
name: "token amount more than balance",
transaction: fromTransactionRaw({
family: "cardano",
recipient:
"addr_test1qpl90kc2jl5kr9tev0s7vays9yhwcdnq8nlylyk4dqsdq3g466elxnxwrzwq72pvp5akenj30t5s9et7frfvrxxx8xcsxrzs87",
amount: "101",
subAccountId:
"js:2:cardano_testnet:806499588e0c4a58f4119f7e6e096bf42c3f774a528d2acec9e82ceebf87d1ceb3d4f3622dd2c77c65cc89c123f79337db22cf8a69f122e36dab1bf5083bf82d:cardano+cardano_testnet%2Fnative%2F47be64fcc8a7fe5321b976282ce4e43e4d29015f6613cfabcea28eab54657374",
mode: "send",
poolId: undefined,
}),
expectedStatus: {
amount: new BigNumber("101"),
errors: {
amount: new NotEnoughBalance(),
},
},
},
{
name: "send max token",
transaction: fromTransactionRaw({
family: "cardano",
recipient:
"addr_test1qpl90kc2jl5kr9tev0s7vays9yhwcdnq8nlylyk4dqsdq3g466elxnxwrzwq72pvp5akenj30t5s9et7frfvrxxx8xcsxrzs87",
amount: "0",
subAccountId:
"js:2:cardano_testnet:806499588e0c4a58f4119f7e6e096bf42c3f774a528d2acec9e82ceebf87d1ceb3d4f3622dd2c77c65cc89c123f79337db22cf8a69f122e36dab1bf5083bf82d:cardano+cardano_testnet%2Fnative%2F47be64fcc8a7fe5321b976282ce4e43e4d29015f6613cfabcea28eab54657374",
mode: "send",
useAllAmount: true,
poolId: undefined,
}),
expectedStatus: {
amount: new BigNumber("100"),
totalSpent: new BigNumber("100"),
errors: {},
warnings: {},
},
},
*/
{
name: "delegate to invalid poolId",
transaction: fromTransactionRaw({
family: "cardano",
recipient: "",
amount: "0",
mode: "delegate",
poolId: "efae72c07a26e4542ba55ef59d35ad45ffaaac312865e3a758ede",
}),
expectedStatus: {
errors: {
poolId: new CardanoInvalidPoolId(),
},
},
},
{
name: "delegate valid poolId",
transaction: fromTransactionRaw({
family: "cardano",
recipient: "",
amount: "0",
mode: "delegate",
poolId: "efae72c07a26e4542ba55ef59d35ad45ffaaac312865e3a758ede997",
}),
expectedStatus: {},
},
],
},
],
},
},
};

describe("Cardano bridge", () => {
test.todo(
"This is an empty test to make jest command pass. Remove it once there is a real test.",
);
});

0 comments on commit 00de9c9

Please sign in to comment.