diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c29d07e8b..03ac8102b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -317,9 +317,8 @@ jobs: needs: [install-dependencies] if: | github.base_ref == 'master' || contains(github.base_ref, 'staging') || contains(github.base_ref, 'production') || - contains(needs.install-dependencies.outputs.all_modified_files, 'packages/cli') || + contains(needs.install-dependencies.outputs.all_modified_files, 'packages/**') || contains(needs.install-dependencies.outputs.all_modified_files, 'packages/sdk') || - contains(needs.install-dependencies.outputs.all_modified_files, 'packages/typescript') || contains(needs.install-dependencies.outputs.all_modified_files, ',package.json') || contains(needs.install-dependencies.outputs.all_modified_files, ',yarn.lock') || false diff --git a/packages/docs/viem-account-ledger/README.md b/packages/docs/viem-account-ledger/README.md new file mode 100644 index 000000000..c6a6f6e8a --- /dev/null +++ b/packages/docs/viem-account-ledger/README.md @@ -0,0 +1,57 @@ +@celo/viem-account-ledger / [Modules](modules.md) + +# @celo/viem-account-ledger + +This library aims to ease the usage of a ledger device with (viem)[https://viem.sh/]. + +## Installation + +```bash +npm install @celo/viem-account-ledger viem@2 @ledgerhq/transport-node-hid@6.x +# or yarn or bun or ... +``` + +> [!IMPORTANT] > `viem` is a peer dependency and MUST be installed alongside this library. +> `@ledgerhq/transport-node-hid` is a peer dependency and MUST be installed alongside this library. + +## Usage + +```ts +import TransportNodeHid from '@ledgerhq/hw-transport-node-hid' +import { createWalletClient } from 'viem' +import { celo, celoAlfajores } from 'viem/chains' +import { ledgerToAccount } from '@celo/viem-account-ledger' + +async function main() => { + const account = await ledgerToAccount({ + transport: await TransportNodeHid.open(''), + }) + const client = createWalletClient({ + account, + chain: celo, + transport: http() + }); + await client.sendTransaction({ + to: '0x123...', + value: 10n, + feeCurrency: '0x123...' + }); +} +``` + +You can also use the `account` directly eg: + +```ts +const account = await ledgerToAccount({ + transport: await TransportNodeHid.open(''), +}) +account.signTransaction({ + to: '0x123...', + value: 123n, + chainId: celoAlfajores.id, + nonce: 42, + maxFeePerGas: 100n, + maxPriorityFeePerGas: 100n, + feeCurrency: '0x123...', +}) +``` diff --git a/packages/docs/viem-account-ledger/modules.md b/packages/docs/viem-account-ledger/modules.md new file mode 100644 index 000000000..605257c8e --- /dev/null +++ b/packages/docs/viem-account-ledger/modules.md @@ -0,0 +1,10 @@ +[@celo/viem-account-ledger](README.md) / Modules + +# @celo/viem-account-ledger + +## Table of contents + +### Modules + +- [index](modules/index.md) +- [ledger-to-account](modules/ledger_to_account.md) diff --git a/packages/docs/viem-account-ledger/modules/index.md b/packages/docs/viem-account-ledger/modules/index.md new file mode 100644 index 000000000..20cd19a72 --- /dev/null +++ b/packages/docs/viem-account-ledger/modules/index.md @@ -0,0 +1,29 @@ +[@celo/viem-account-ledger](../README.md) / [Modules](../modules.md) / index + +# Module: index + +## Table of contents + +### References + +- [CELO\_BASE\_DERIVATION\_PATH](index.md#celo_base_derivation_path) +- [DEFAULT\_DERIVATION\_PATH](index.md#default_derivation_path) +- [ledgerToAccount](index.md#ledgertoaccount) + +## References + +### CELO\_BASE\_DERIVATION\_PATH + +Re-exports [CELO_BASE_DERIVATION_PATH](ledger_to_account.md#celo_base_derivation_path) + +___ + +### DEFAULT\_DERIVATION\_PATH + +Re-exports [DEFAULT_DERIVATION_PATH](ledger_to_account.md#default_derivation_path) + +___ + +### ledgerToAccount + +Re-exports [ledgerToAccount](ledger_to_account.md#ledgertoaccount) diff --git a/packages/docs/viem-account-ledger/modules/ledger_to_account.md b/packages/docs/viem-account-ledger/modules/ledger_to_account.md new file mode 100644 index 000000000..f88e9f991 --- /dev/null +++ b/packages/docs/viem-account-ledger/modules/ledger_to_account.md @@ -0,0 +1,86 @@ +[@celo/viem-account-ledger](../README.md) / [Modules](../modules.md) / ledger-to-account + +# Module: ledger-to-account + +## Table of contents + +### Type Aliases + +- [LedgerAccount](ledger_to_account.md#ledgeraccount) + +### Variables + +- [CELO\_BASE\_DERIVATION\_PATH](ledger_to_account.md#celo_base_derivation_path) +- [DEFAULT\_DERIVATION\_PATH](ledger_to_account.md#default_derivation_path) +- [ETH\_DERIVATION\_PATH\_BASE](ledger_to_account.md#eth_derivation_path_base) + +### Functions + +- [ledgerToAccount](ledger_to_account.md#ledgertoaccount) + +## Type Aliases + +### LedgerAccount + +Ƭ **LedgerAccount**: `LocalAccount`\<``"ledger"``\> + +#### Defined in + +[ledger-to-account.ts:10](https://github.com/celo-org/developer-tooling/blob/master/packages/viem-account-ledger/src/ledger-to-account.ts#L10) + +## Variables + +### CELO\_BASE\_DERIVATION\_PATH + +• `Const` **CELO\_BASE\_DERIVATION\_PATH**: `string` + +#### Defined in + +[ledger-to-account.ts:13](https://github.com/celo-org/developer-tooling/blob/master/packages/viem-account-ledger/src/ledger-to-account.ts#L13) + +___ + +### DEFAULT\_DERIVATION\_PATH + +• `Const` **DEFAULT\_DERIVATION\_PATH**: `string` + +#### Defined in + +[ledger-to-account.ts:14](https://github.com/celo-org/developer-tooling/blob/master/packages/viem-account-ledger/src/ledger-to-account.ts#L14) + +___ + +### ETH\_DERIVATION\_PATH\_BASE + +• `Const` **ETH\_DERIVATION\_PATH\_BASE**: ``"m/44'/60'/0'"`` + +#### Defined in + +[ledger-to-account.ts:12](https://github.com/celo-org/developer-tooling/blob/master/packages/viem-account-ledger/src/ledger-to-account.ts#L12) + +## Functions + +### ledgerToAccount + +▸ **ledgerToAccount**(`options`): `Promise`\<[`LedgerAccount`](ledger_to_account.md#ledgeraccount)\> + +A function to create a ledger account for viem + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `options` | `Object` | `undefined` | | +| `options.baseDerivationPath?` | `string` | `DEFAULT_DERIVATION_PATH` | defaults to "m/44'/60'/0" | +| `options.derivationPathIndex?` | `string` \| `number` | `0` | aka addressIndex | +| `options.transport` | `default` | `undefined` | a Ledger Transport | + +#### Returns + +`Promise`\<[`LedgerAccount`](ledger_to_account.md#ledgeraccount)\> + +a viem LocalAccount<"ledger"> + +#### Defined in + +[ledger-to-account.ts:25](https://github.com/celo-org/developer-tooling/blob/master/packages/viem-account-ledger/src/ledger-to-account.ts#L25) diff --git a/packages/viem-account-ledger/src/data.ts b/packages/viem-account-ledger/src/data.ts index d348d9795..8cdf5130a 100644 --- a/packages/viem-account-ledger/src/data.ts +++ b/packages/viem-account-ledger/src/data.ts @@ -1,6 +1,7 @@ // export default 'AAAAaARDRUxPRx7ON1DaI3+TuOM5xTaYm4l4pDgAAAASAACk7DBFAiEA5rECRg94+fCoIvoG9/5qWh62zl2C6Y+aFuuZrFe4CtcCIEJbRrkL3gqwT/Jj+7L3neazgpVCCTZZ3HX9JXXg5vleAAAAaARjVVNEdl3oFoRYYedaJfyhIrtomLixKCoAAAASAACk7DBFAiEApwQFHNBKXp+V2jq8BMD2y/5AwC9bhPQ2H4hT/vMl/B4CIFalOVtBFGREUKMU/F5vDlJLeQrTn6GQeDertpB2FpMvAAAAaARjRVVS2HY8uidqNzjm3oW0s79f3tbWynMAAAASAACk7DBFAiEAh2UeP1+SI2Ed5SiAjpJF6MkMrVa94gUwjJztyBlzhWMCIHfaOrEsxdxAGx+P+hxuSNO4zcw6KRLfJkkuic1V/CrHAAAAagZiIENFTE/dyb5X9VP+dXUtYWBrlMvX4CZO+AAAABIAAPNwMEUCIQCi62KsBfuNcfX0MriiRZ7a5DKERhtIz7sZ1SqBT7ruhgIgVrfmavyWzxzDW4AQeHn++A4qPjB1pQKoHvNXo8Hf1SMAAABpBmIgY1VTRGJJKmRKWI/ZBCcL7QatUrmr/qGuAAAAEgAA83AwRAIgGDYx4oB/gkYUqLeXqvEZXx9nOxVHzTe2ajyd2wnehxgCICQBe/rBPcXiaQJj3pdoXxroct/hV6r3G2G7y79EOEAPAAAAaQZiIGNFVVL57OMBJHrSziGJSUGDCiRw9Od0ygAAABIAAPNwMEQCIEdcFWP+HxEUoF1sCGVd34QGS0hL5cVUdrWdqVm3bYTgAiBCMA+Rg3Ubc3xla/35wzZesPlbeSMEPcr4uqL+8PeydwAAAGoGYSBDRUxP8ZSv31CwPmm9fQV8GqnhDJlU5MkAAAASAACu8zBFAiEAk/o0FBus2/QCrunFGEyoneQIRaMRC+y5L6Dvar8MU/kCIByJt2ziRhDG3AAbyXBIuJfZQujSHFcSJL3xF0xIlcPdAAAAaQZhIGNVU0SHQGn6HrFtRNYi8uDKJe6hcjabwQAAABIAAK7zMEQCIClrH2xgE3WMbD+hgQ7t5SiAcVG5WiUZ655voqCszKEoAiA/cO8UVgNY891MNJ5yeDk8w47WO0E1DQecrK71LR8g8gAAAGoGYSBjRVVSEMiSpuxDpT5F0LkWtLfTg7G3jA8AAAASAACu8zBFAiEAgpktbB1ZxyAwMJwKTSbZ30n8zgRuW0twbXoZxlsUAswCIHek4l4CIbjVMG2HVr0Ml9/8kA4F9dr69JBMaoSUkdKl' // This was signed by Marek Olszewski on Wed 18 June 2024 +/** @internal */ export default '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' // How did we get this? By following these steps: @@ -11,6 +12,7 @@ export default 'AAAAZwRVU0RUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAACk7DBEAiA45AhZco0/ // 5 - and store it in key `KEY=04b06cf5d8f7ed71d8bd9b9dc37944a1c6d240f69bb0be3621dddbb6ac0eccd1508bcc2ea46227e43b941e2c6f1b1cd0ae68e54b185e2cabef3455580604bd45b8` // 5 - finally run `echo $ASN1_PREFIX$KEY | xxd -r -p - | openssl ec -inform der -pubin -pubout` // 6 - enjoy +/** @internal */ export const legacyLedgerPublicKeyHex = [ `-----BEGIN PUBLIC KEY-----`, `MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEsGz12Pftcdi9m53DeUShxtJA9puwvjYh`, diff --git a/packages/viem-account-ledger/src/ledger-to-account.ts b/packages/viem-account-ledger/src/ledger-to-account.ts index 3c8e1df05..c621270a7 100644 --- a/packages/viem-account-ledger/src/ledger-to-account.ts +++ b/packages/viem-account-ledger/src/ledger-to-account.ts @@ -7,12 +7,21 @@ import { CeloTransactionSerializable, serializeTransaction } from 'viem/celo' import { checkForKnownToken, generateLedger } from './utils.js' -type LedgerAccount = LocalAccount<'ledger'> +export type LedgerAccount = LocalAccount<'ledger'> export const ETH_DERIVATION_PATH_BASE = "m/44'/60'/0'" as const export const CELO_BASE_DERIVATION_PATH = `${CELO_DERIVATION_PATH_BASE.slice(2)}/0` export const DEFAULT_DERIVATION_PATH = `${ETH_DERIVATION_PATH_BASE.slice(2)}/0` +/** + * A function to create a ledger account for viem + * @param options + * @param options.transport a Ledger Transport + * @param options.derivationPathIndex aka addressIndex + * @param options.baseDerivationPath defaults to "m/44'/60'/0" + * + * @returns a viem LocalAccount<"ledger"> + */ export async function ledgerToAccount({ transport, derivationPathIndex = 0, diff --git a/packages/viem-account-ledger/src/types.ts b/packages/viem-account-ledger/src/types.ts index 0a1099279..9fd99c9a7 100644 --- a/packages/viem-account-ledger/src/types.ts +++ b/packages/viem-account-ledger/src/types.ts @@ -1 +1,2 @@ +/** @internal */ export type Hex = `0x${string}` diff --git a/packages/viem-account-ledger/typedoc.json b/packages/viem-account-ledger/typedoc.json index 27e4b830b..c18df7f9e 100644 --- a/packages/viem-account-ledger/typedoc.json +++ b/packages/viem-account-ledger/typedoc.json @@ -5,8 +5,9 @@ "hideGenerator": true, "out": "../docs/viem-account-ledger", "gitRevision": "master", - "readme": "none", - "entryPoints": ["./src"], + "readme": "./README.md", + "entryPoints": ["./src/index.ts", "./src/ledger-to-account.ts"], + "excludeInternal": true, "githubPages": false, "plugin": ["typedoc-plugin-markdown"], "entryPointStrategy": "expand"