Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Coin Modularization] Solana #6721

Merged
merged 13 commits into from
May 3, 2024
8 changes: 8 additions & 0 deletions .changeset/perfect-fishes-develop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@ledgerhq/coin-solana": minor
"ledger-live-desktop": minor
"live-mobile": minor
"@ledgerhq/live-common": minor
---

Solana as a coin module
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import StepConfirmation, { StepConfirmationFooter } from "./steps/StepConfirmati
import StepValidator, { StepValidatorFooter } from "./steps/StepValidator";
import { St, StepProps, StepId } from "./types";
import { Device } from "@ledgerhq/live-common/hw/actions/types";
import { defaultVoteAccAddrByCurrencyId } from "@ledgerhq/live-common/families/solana/utils";
import { defaultVoteAccAddrByCurrencyId } from "@ledgerhq/live-common/families/solana/staking";
export type Data = {
account: SolanaAccount;
source?: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { getMainAccount } from "@ledgerhq/live-common/account/index";
import { SOLANA_DELEGATION_RESERVE } from "@ledgerhq/live-common/families/solana/utils";
import { SOLANA_DELEGATION_RESERVE } from "@ledgerhq/live-common/families/solana/staking";
import React, { Fragment, PureComponent } from "react";
import { Trans } from "react-i18next";
import TrackPage from "~/renderer/analytics/TrackPage";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import LinkWithExternalIcon from "~/renderer/components/LinkWithExternalIcon";
import { useTranslation } from "react-i18next";
import { urls } from "~/config/urls";
import { openURL } from "~/renderer/linking";
import { LEDGER_VALIDATOR } from "@ledgerhq/live-common/families/solana/utils";
import { LEDGER_VALIDATOR } from "@ledgerhq/live-common/families/solana/staking";
import { Transaction } from "@ledgerhq/live-common/families/solana/types";
type Props = {
transaction: Transaction;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index";
import { getAddressExplorer, getDefaultExplorerView } from "@ledgerhq/live-common/explorers";
import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/validator-app/index";
import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/staking";
import { CryptoCurrency, Unit } from "@ledgerhq/types-cryptoassets";
import { BigNumber } from "bignumber.js";
import React, { useCallback } from "react";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { getAccountUnit } from "@ledgerhq/live-common/account/index";
import { useValidators } from "@ledgerhq/live-common/families/solana/react";
import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/validator-app/index";
import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/staking";
import { SolanaAccount } from "@ledgerhq/live-common/families/solana/types";

import React, { useMemo, useState, useCallback } from "react";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { getAccountUnit } from "@ledgerhq/live-common/account/index";
import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers";
import { getAccountBridge } from "@ledgerhq/live-common/bridge/index";
import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction";
import { SOLANA_DELEGATION_RESERVE } from "@ledgerhq/live-common/families/solana/utils";
import { SOLANA_DELEGATION_RESERVE } from "@ledgerhq/live-common/families/solana/staking";
import { useTheme } from "@react-navigation/native";
import { BigNumber } from "bignumber.js";
import invariant from "invariant";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { getAccountUnit } from "@ledgerhq/live-common/account/index";
import { useValidators } from "@ledgerhq/live-common/families/solana/react";
import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/validator-app/index";
import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/staking";
import { AccountLike } from "@ledgerhq/types-live";
import { Text } from "@ledgerhq/native-ui";
import { useTheme } from "@react-navigation/native";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import {
Transaction as SolanaTransaction,
TransactionModel,
} from "@ledgerhq/live-common/families/solana/types";
import { assertUnreachable } from "@ledgerhq/live-common/families/solana/utils";
import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/validator-app/index";
import {
assertUnreachable,
ValidatorsAppValidator,
} from "@ledgerhq/live-common/families/solana/staking";
import { AccountLike } from "@ledgerhq/types-live";
import { Text } from "@ledgerhq/native-ui";
import { useTheme } from "@react-navigation/native";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type {
TransactionStatus,
} from "@ledgerhq/live-common/families/solana/types";
import { ParamListBase, RouteProp } from "@react-navigation/native";
import type { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/validator-app/index";
import type { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/staking";
import type { Operation } from "@ledgerhq/types-live";
import type { Device } from "@ledgerhq/live-common/hw/actions/types";
import { ScreenName } from "~/const";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index";
import { SolanaStakeWithMeta } from "@ledgerhq/live-common/families/solana/types";
import { sweetch } from "@ledgerhq/live-common/families/solana/utils";
import { sweetch } from "@ledgerhq/live-common/families/solana/staking";
import { Currency, Unit } from "@ledgerhq/types-cryptoassets";
import { Text } from "@ledgerhq/native-ui";
import { useTheme } from "@react-navigation/native";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
assertUnreachable,
sweetch,
tupleOfUnion,
} from "@ledgerhq/live-common/families/solana/utils";
} from "@ledgerhq/live-common/families/solana/staking";
import { AccountLike } from "@ledgerhq/types-live";
import { Box, Text } from "@ledgerhq/native-ui";
import { useNavigation, useTheme } from "@react-navigation/native";
Expand Down
20 changes: 20 additions & 0 deletions libs/coin-modules/coin-solana/.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",
},
};
16 changes: 16 additions & 0 deletions libs/coin-modules/coin-solana/.unimportedrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"entry": [
"src/api/index.ts",
"src/bridge/js.ts",
"src/cli-transaction.ts",
"src/deviceTransactionConfig.ts",
"src/errors.ts",
"src/hw-getAddress.ts",
"src/serialization.ts",
"src/specs.ts",
"src/transaction.ts"
],
"ignorePatterns": ["**/node_modules/**", "**/*.fixture.ts", "**/*.mock.ts", "**/*.test.{js,jsx,ts,tsx}"],
"ignoreUnresolved": [],
"ignoreUnimported": ["src/datasets/solana.scanAccounts.1.ts"]
}
9 changes: 9 additions & 0 deletions libs/coin-modules/coin-solana/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testPathIgnorePatterns: [
"lib/",
"lib-es/"
]
};
89 changes: 89 additions & 0 deletions libs/coin-modules/coin-solana/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
{
"name": "@ledgerhq/coin-solana",
"version": "0.6.0",
"description": "Ledger Solana Coin integration",
"keywords": [
"Ledger",
"LedgerWallet",
"sol",
"Solana",
"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-solana",
"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-env": "workspace:^",
"@ledgerhq/live-network": "workspace:^",
"@ledgerhq/logs": "workspace:^",
"@ledgerhq/types-cryptoassets": "workspace:^",
"@ledgerhq/types-live": "workspace:^",
"@solana/spl-token": "^0.3.7",
"@solana/web3.js": "1.77.3",
"bignumber.js": "^9.1.2",
"bs58": "^4.0.1",
"expect": "^27.4.6",
"invariant": "^2.2.2",
"lodash": "^4.17.21",
"object-hash": "^2.2.0",
"rxjs": "^7.8.1",
"superstruct": "0.14.2"
},
"devDependencies": {
"@types/bs58": "^4.0.1",
"@types/invariant": "^2.2.2",
"@types/jest": "^29.5.10",
"@types/lodash": "^4.14.191",
"@types/object-hash": "^2.1.0",
"@faker-js/faker": "^8.4.1",
"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",
"typecheck": "tsc --noEmit",
"unimported": "unimported"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import { getEnv } from "@ledgerhq/live-env";
import { Awaited } from "../../logic";
import { NetworkError } from "@ledgerhq/errors";

export const LATEST_BLOCKHASH_MOCK = "EEbZs6DmDyDjucyYbo3LwVJU7pQYuVopYcYTSEZXskW3";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is it here ? Is it a random hash ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know its purpose.
I move it for convient reason, as it is used within api calls.


export type Config = {
readonly endpoint: string;
};
Expand Down Expand Up @@ -72,7 +74,7 @@ export type ChainAPI = Readonly<{
}>;

// Naive mode, allow us to filter in sentry all this error comming from Sol RPC node
const remapErrors = e => {
const remapErrors = (e: Error) => {
throw new NetworkError(e?.message);
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { ChainAPI } from "./chain";

//import fs from "fs";
import { Message, PublicKey } from "@solana/web3.js";
import { LATEST_BLOCKHASH_MOCK } from "../bridge/mock-data";
import { LATEST_BLOCKHASH_MOCK } from "./chain";

/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
function write(file: string, str: string) {
Expand All @@ -20,6 +20,8 @@ export function logged(api: ChainAPI, file: string): ChainAPI {
if (typeof targetValue === "function") {
const method: keyof ChainAPI = propKey as any;
return function (...args: unknown[]) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore: TS-2683
const result = targetValue.apply(this, args);
const log = (answer: unknown) => {
if (method === "getLatestBlockhash") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ export function queued(api: ChainAPI, delayBetweenRuns = 100): ChainAPI {
const targetValue = Reflect.get(target, propKey, receiver);
if (typeof targetValue === "function") {
return function (...args: unknown[]) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore: TS-2683
return q.submit(() => targetValue.apply(this, args));
};
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ export function traced(api: ChainAPI): ChainAPI {
log("network", formatMsg({ reqId, msg: `calling <${propKey}>` }), {
args,
});
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore: TS-2683
const result = targetValue.apply(this, args);
if (result instanceof Promise) {
return result
Expand Down
Loading
Loading