@rango-dev/provider-ledger 0.20.1-next.1 → 0.21.1-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/{TransportWebHID-JLT4ETY3.js → TransportWebHID-HV53OYSS.js} +2 -2
- package/dist/chunk-L3UWJBD6.js +2 -0
- package/dist/chunk-L3UWJBD6.js.map +7 -0
- package/dist/constants.d.ts +6 -0
- package/dist/{ethereum-NIQRUD6P.js → ethereum-4K63WN6K.js} +2 -2
- package/dist/ethereum-4K63WN6K.js.map +7 -0
- package/dist/{index.d.ts → legacy/index.d.ts} +4 -2
- package/dist/mod.d.ts +2 -0
- package/dist/mod.js +2 -0
- package/dist/mod.js.map +7 -0
- package/dist/namespaces/evm.d.ts +3 -0
- package/dist/namespaces/solana.d.ts +3 -0
- package/dist/provider-ledger.build.json +1 -1
- package/dist/provider.d.ts +2 -0
- package/dist/solana-KIPRMAWD.js +2 -0
- package/dist/solana-KIPRMAWD.js.map +7 -0
- package/dist/{helpers.d.ts → utils.d.ts} +3 -2
- package/package.json +7 -7
- package/readme.md +16 -1
- package/src/constants.ts +91 -0
- package/src/{index.ts → legacy/index.ts} +15 -4
- package/src/mod.ts +12 -0
- package/src/namespaces/evm.ts +58 -0
- package/src/namespaces/solana.ts +50 -0
- package/src/provider.ts +22 -0
- package/src/signers/ethereum.ts +2 -2
- package/src/signers/solana.ts +2 -2
- package/src/{helpers.ts → utils.ts} +22 -16
- package/dist/chunk-PVLX7NBP.js +0 -2
- package/dist/chunk-PVLX7NBP.js.map +0 -7
- package/dist/ethereum-NIQRUD6P.js.map +0 -7
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -7
- package/dist/solana-CMBORE4C.js +0 -2
- package/dist/solana-CMBORE4C.js.map +0 -7
- /package/dist/{TransportWebHID-JLT4ETY3.js.map → TransportWebHID-HV53OYSS.js.map} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o}from"./chunk-OOX2UCLJ.js";import{d as e,l,p as c,q as f}from"./chunk-L3UWJBD6.js";import{a}from"./chunk-CVKDPNYM.js";import{generalSolanaTransactionExecutor as w}from"@rango-dev/signer-solana";import{PublicKey as T}from"@solana/web3.js";import{SignerError as h,SignerErrorCode as y}from"rango-types";function x(g){return"version"in g}a(x,"isVersionedTransaction");var m=class{static{a(this,"SolanaSigner")}async signMessage(t){try{let r=await c();return(await new o(r).signOffchainMessage(e(),Buffer.from(t))).signature.toString()}catch(r){throw new h(y.SIGN_TX_ERROR,void 0,r)}}async signAndSendTx(t){try{return{hash:await w(t,a(async n=>{let p=await c(),i=new o(p),s;x(n)?s=await i.signTransaction(e(),n.message.serialize()):s=await i.signTransaction(e(),n.serialize());let u=await i.getAddress(e()),S=new T(u.address);return n.addSignature(S,Buffer.from(s.signature)),n.serialize()},"DefaultSolanaSigner"))}}catch(r){throw l(r)}finally{await f()}}};export{m as SolanaSigner,x as isVersionedTransaction};
|
|
2
|
+
//# sourceMappingURL=solana-KIPRMAWD.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/signers/solana.ts"],
|
|
4
|
+
"sourcesContent": ["import type { SolanaWeb3Signer } from '@rango-dev/signer-solana';\nimport type { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport type { GenericSigner, SolanaTransaction } from 'rango-types';\n\nimport Solana from '@ledgerhq/hw-app-solana';\nimport { generalSolanaTransactionExecutor } from '@rango-dev/signer-solana';\nimport { PublicKey } from '@solana/web3.js';\nimport { SignerError, SignerErrorCode } from 'rango-types';\n\nimport { getDerivationPath } from '../state.js';\nimport {\n getLedgerError,\n transportConnect,\n transportDisconnect,\n} from '../utils.js';\n\nexport function isVersionedTransaction(\n transaction: Transaction | VersionedTransaction\n): transaction is VersionedTransaction {\n return 'version' in transaction;\n}\n\nexport class SolanaSigner implements GenericSigner<SolanaTransaction> {\n async signMessage(msg: string): Promise<string> {\n try {\n const transport = await transportConnect();\n\n const solana = new Solana(transport);\n\n const result = await solana.signOffchainMessage(\n getDerivationPath(),\n Buffer.from(msg)\n );\n return result.signature.toString();\n } catch (error) {\n throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, error);\n }\n }\n\n async signAndSendTx(tx: SolanaTransaction): Promise<{ hash: string }> {\n try {\n const DefaultSolanaSigner: SolanaWeb3Signer = async (\n solanaWeb3Transaction: Transaction | VersionedTransaction\n ) => {\n const transport = await transportConnect();\n const solana = new Solana(transport);\n\n let signResult;\n if (isVersionedTransaction(solanaWeb3Transaction)) {\n signResult = await solana.signTransaction(\n getDerivationPath(),\n solanaWeb3Transaction.message.serialize() as Buffer\n );\n } else {\n signResult = await solana.signTransaction(\n getDerivationPath(),\n solanaWeb3Transaction.serialize()\n );\n }\n\n const addressResult = await solana.getAddress(getDerivationPath());\n\n const publicKey = new PublicKey(addressResult.address);\n\n solanaWeb3Transaction.addSignature(\n publicKey,\n Buffer.from(signResult.signature)\n );\n\n const serializedTx = solanaWeb3Transaction.serialize();\n\n return serializedTx;\n };\n const hash = await generalSolanaTransactionExecutor(\n tx,\n DefaultSolanaSigner\n );\n return { hash };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "mIAKA,OAAS,oCAAAA,MAAwC,2BACjD,OAAS,aAAAC,MAAiB,kBAC1B,OAAS,eAAAC,EAAa,mBAAAC,MAAuB,cAStC,SAASC,EACdC,EACqC,CACrC,MAAO,YAAaA,CACtB,CAJgBC,EAAAF,EAAA,0BAMT,IAAMG,EAAN,KAA+D,CAtBtE,MAsBsE,CAAAD,EAAA,qBACpE,MAAM,YAAYE,EAA8B,CAC9C,GAAI,CACF,IAAMC,EAAY,MAAMC,EAAiB,EAQzC,OAJe,MAFA,IAAIC,EAAOF,CAAS,EAEP,oBAC1BG,EAAkB,EAClB,OAAO,KAAKJ,CAAG,CACjB,GACc,UAAU,SAAS,CACnC,OAASK,EAAO,CACd,MAAM,IAAIC,EAAYC,EAAgB,cAAe,OAAWF,CAAK,CACvE,CACF,CAEA,MAAM,cAAcG,EAAkD,CACpE,GAAI,CAqCF,MAAO,CAAE,KAJI,MAAMC,EACjBD,EAjC4CV,EAAA,MAC5CY,GACG,CACH,IAAMT,EAAY,MAAMC,EAAiB,EACnCS,EAAS,IAAIR,EAAOF,CAAS,EAE/BW,EACAhB,EAAuBc,CAAqB,EAC9CE,EAAa,MAAMD,EAAO,gBACxBP,EAAkB,EAClBM,EAAsB,QAAQ,UAAU,CAC1C,EAEAE,EAAa,MAAMD,EAAO,gBACxBP,EAAkB,EAClBM,EAAsB,UAAU,CAClC,EAGF,IAAMG,EAAgB,MAAMF,EAAO,WAAWP,EAAkB,CAAC,EAE3DU,EAAY,IAAIC,EAAUF,EAAc,OAAO,EAErD,OAAAH,EAAsB,aACpBI,EACA,OAAO,KAAKF,EAAW,SAAS,CAClC,EAEqBF,EAAsB,UAAU,CAGvD,EA/B8C,sBAmC9C,CACc,CAChB,OAASL,EAAO,CACd,MAAMW,EAAeX,CAAK,CAC5B,QAAE,CACA,MAAMY,EAAoB,CAC5B,CACF,CACF",
|
|
6
|
+
"names": ["generalSolanaTransactionExecutor", "PublicKey", "SignerError", "SignerErrorCode", "isVersionedTransaction", "transaction", "__name", "SolanaSigner", "msg", "transport", "transportConnect", "Solana", "getDerivationPath", "error", "SignerError", "SignerErrorCode", "tx", "generalSolanaTransactionExecutor", "solanaWeb3Transaction", "solana", "signResult", "addressResult", "publicKey", "PublicKey", "getLedgerError", "transportDisconnect"]
|
|
7
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type Transport from '@ledgerhq/hw-transport';
|
|
2
2
|
import { type ProviderConnectResult } from '@rango-dev/wallets-shared';
|
|
3
|
-
export
|
|
3
|
+
export type Provider = Map<string, unknown>;
|
|
4
|
+
export declare function ledger(): Provider | null;
|
|
4
5
|
export declare function getLedgerError(error: any): any;
|
|
5
|
-
export declare function
|
|
6
|
+
export declare function standardizeAndThrowLedgerError(_: unknown, error: unknown): void;
|
|
6
7
|
export declare function getEthereumAccounts(): Promise<ProviderConnectResult>;
|
|
7
8
|
export declare function getSolanaAccounts(): Promise<ProviderConnectResult>;
|
|
8
9
|
export declare function transportConnect(): Promise<Transport>;
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rango-dev/provider-ledger",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.1-next.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"source": "./src/
|
|
7
|
-
"main": "./dist/
|
|
6
|
+
"source": "./src/mod.ts",
|
|
7
|
+
"main": "./dist/mod.js",
|
|
8
8
|
"exports": {
|
|
9
|
-
".": "./dist/
|
|
9
|
+
".": "./dist/mod.js"
|
|
10
10
|
},
|
|
11
|
-
"typings": "dist/
|
|
11
|
+
"typings": "dist/mod.d.ts",
|
|
12
12
|
"files": [
|
|
13
13
|
"dist",
|
|
14
14
|
"src"
|
|
15
15
|
],
|
|
16
16
|
"scripts": {
|
|
17
|
-
"build": "node ../../scripts/build/command.mjs --path wallets/provider-ledger --splitting --external-all-except @ledgerhq/errors,@ledgerhq/hw-app-eth,@ledgerhq/hw-app-solana,@ledgerhq/hw-transport-webhid,@ledgerhq/types-cryptoassets,@ledgerhq/types-devices
|
|
17
|
+
"build": "node ../../scripts/build/command.mjs --path wallets/provider-ledger --splitting --external-all-except @ledgerhq/errors,@ledgerhq/hw-app-eth,@ledgerhq/hw-app-solana,@ledgerhq/hw-transport-webhid,@ledgerhq/types-cryptoassets,@ledgerhq/types-devices --inputs src/mod.ts",
|
|
18
18
|
"ts-check": "tsc --declaration --emitDeclarationOnly -p ./tsconfig.json",
|
|
19
19
|
"clean": "rimraf dist",
|
|
20
20
|
"format": "prettier --write '{.,src}/**/*.{ts,tsx}'",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@ledgerhq/types-cryptoassets": "^7.11.0",
|
|
29
29
|
"@ledgerhq/types-devices": "^6.24.0",
|
|
30
30
|
"@rango-dev/signer-solana": "^0.44.0",
|
|
31
|
-
"@rango-dev/wallets-shared": "^0.
|
|
31
|
+
"@rango-dev/wallets-shared": "^0.50.1-next.0",
|
|
32
32
|
"@solana/web3.js": "^1.91.4",
|
|
33
33
|
"@types/w3c-web-hid": "^1.0.2",
|
|
34
34
|
"bs58": "^5.0.0",
|
package/readme.md
CHANGED
|
@@ -1 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Ledger
|
|
2
|
+
|
|
3
|
+
Ledger integration for hub.
|
|
4
|
+
[Homepage](https://www.ledger.com/) | [Docs](https://developers.ledger.com/)
|
|
5
|
+
|
|
6
|
+
## Implementation notes/limitations
|
|
7
|
+
|
|
8
|
+
### Group
|
|
9
|
+
|
|
10
|
+
#### ⚠️ EVM
|
|
11
|
+
|
|
12
|
+
We only support Ethereum for now.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
More wallet information can be found in [readme.md](../readme.md).
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type ProviderMetadata } from '@rango-dev/wallets-core';
|
|
2
|
+
import { LegacyNetworks } from '@rango-dev/wallets-core/legacy';
|
|
3
|
+
import { Networks } from '@rango-dev/wallets-shared';
|
|
4
|
+
import { type BlockchainMeta } from 'rango-types';
|
|
5
|
+
|
|
6
|
+
import getSigners from './signer.js';
|
|
7
|
+
|
|
8
|
+
export const EVM_SUPPORTED_CHAINS = [
|
|
9
|
+
LegacyNetworks.ETHEREUM,
|
|
10
|
+
LegacyNetworks.POLYGON,
|
|
11
|
+
LegacyNetworks.BASE,
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export const HEXADECIMAL_BASE = 16;
|
|
15
|
+
export const WALLET_ID = 'ledger';
|
|
16
|
+
|
|
17
|
+
export const metadata: ProviderMetadata = {
|
|
18
|
+
name: 'Ledger',
|
|
19
|
+
icon: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/ledger/icon.svg',
|
|
20
|
+
extensions: {
|
|
21
|
+
homepage:
|
|
22
|
+
'https://support.ledger.com/hc/en-us/articles/4404389606417-Download-and-install-Ledger-Live?docs=true',
|
|
23
|
+
},
|
|
24
|
+
properties: [
|
|
25
|
+
{
|
|
26
|
+
name: 'namespaces',
|
|
27
|
+
value: {
|
|
28
|
+
selection: 'single',
|
|
29
|
+
data: [
|
|
30
|
+
{
|
|
31
|
+
label: 'Ethereum',
|
|
32
|
+
value: 'EVM',
|
|
33
|
+
id: 'ETH',
|
|
34
|
+
getSupportedChains: (allBlockchains: BlockchainMeta[]) =>
|
|
35
|
+
allBlockchains.filter(
|
|
36
|
+
(chain) => chain.name === Networks.ETHEREUM
|
|
37
|
+
),
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
label: 'Solana',
|
|
41
|
+
value: 'Solana',
|
|
42
|
+
id: 'SOLANA',
|
|
43
|
+
getSupportedChains: (allBlockchains: BlockchainMeta[]) =>
|
|
44
|
+
allBlockchains.filter((chain) => chain.name === Networks.SOLANA),
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'derivationPath',
|
|
51
|
+
value: {
|
|
52
|
+
data: [
|
|
53
|
+
{
|
|
54
|
+
id: 'metamask',
|
|
55
|
+
label: `Metamask (m/44'/60'/0'/0/index)`,
|
|
56
|
+
namespace: 'EVM',
|
|
57
|
+
generateDerivationPath: (index: string) => `44'/60'/0'/0/${index}`,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: 'ledgerLive',
|
|
61
|
+
label: `LedgerLive (m/44'/60'/index'/0/0)`,
|
|
62
|
+
namespace: 'EVM',
|
|
63
|
+
generateDerivationPath: (index: string) => `44'/60'/${index}'/0/0`,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'legacy',
|
|
67
|
+
label: `Legacy (m/44'/60'/0'/index)`,
|
|
68
|
+
namespace: 'EVM',
|
|
69
|
+
generateDerivationPath: (index: string) => `44'/60'/0'/${index}`,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: `(m/44'/501'/index')`,
|
|
73
|
+
label: `(m/44'/501'/index')`,
|
|
74
|
+
namespace: 'Solana',
|
|
75
|
+
generateDerivationPath: (index: string) => `44'/501'/${index}'`,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: `(m/44'/501'/0'/index)`,
|
|
79
|
+
label: `(m/44'/501'/0'/index)`,
|
|
80
|
+
namespace: 'Solana',
|
|
81
|
+
generateDerivationPath: (index: string) => `44'/501'/0'/${index}`,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'signers',
|
|
88
|
+
value: { getSigners: async () => getSigners() },
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { LegacyProviderInterface } from '@rango-dev/wallets-core/legacy';
|
|
1
2
|
import type {
|
|
2
3
|
Connect,
|
|
3
4
|
Disconnect,
|
|
@@ -8,14 +9,14 @@ import type {
|
|
|
8
9
|
import { Networks, WalletTypes } from '@rango-dev/wallets-shared';
|
|
9
10
|
import { type BlockchainMeta, type SignerFactory } from 'rango-types';
|
|
10
11
|
|
|
12
|
+
import signer from '../signer.js';
|
|
13
|
+
import { setDerivationPath } from '../state.js';
|
|
11
14
|
import {
|
|
12
15
|
getEthereumAccounts,
|
|
13
|
-
getLedgerInstance,
|
|
16
|
+
ledger as getLedgerInstance,
|
|
14
17
|
getSolanaAccounts,
|
|
15
18
|
transportDisconnect,
|
|
16
|
-
} from '
|
|
17
|
-
import signer from './signer.js';
|
|
18
|
-
import { setDerivationPath } from './state.js';
|
|
19
|
+
} from '../utils.js';
|
|
19
20
|
|
|
20
21
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
22
|
type InstanceType = any;
|
|
@@ -154,3 +155,13 @@ export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
|
|
|
154
155
|
},
|
|
155
156
|
};
|
|
156
157
|
};
|
|
158
|
+
|
|
159
|
+
const buildLegacyProvider: () => LegacyProviderInterface = () => ({
|
|
160
|
+
config,
|
|
161
|
+
getInstance,
|
|
162
|
+
connect,
|
|
163
|
+
getSigners,
|
|
164
|
+
getWalletInfo,
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
export { buildLegacyProvider };
|
package/src/mod.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineVersions } from '@rango-dev/wallets-core/utils';
|
|
2
|
+
|
|
3
|
+
import { buildLegacyProvider } from './legacy/index.js';
|
|
4
|
+
import { buildProvider } from './provider.js';
|
|
5
|
+
|
|
6
|
+
const versions = () =>
|
|
7
|
+
defineVersions()
|
|
8
|
+
.version('0.0.0', buildLegacyProvider())
|
|
9
|
+
.version('1.0.0', buildProvider())
|
|
10
|
+
.build();
|
|
11
|
+
|
|
12
|
+
export { versions };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { EvmActions } from '@rango-dev/wallets-core/namespaces/evm';
|
|
2
|
+
|
|
3
|
+
import { NamespaceBuilder } from '@rango-dev/wallets-core';
|
|
4
|
+
import {
|
|
5
|
+
type CaipAccount,
|
|
6
|
+
builders as commonBuilders,
|
|
7
|
+
} from '@rango-dev/wallets-core/namespaces/common';
|
|
8
|
+
import {
|
|
9
|
+
builders,
|
|
10
|
+
CAIP_NAMESPACE,
|
|
11
|
+
} from '@rango-dev/wallets-core/namespaces/evm';
|
|
12
|
+
import { CAIP } from '@rango-dev/wallets-core/utils';
|
|
13
|
+
|
|
14
|
+
import { WALLET_ID } from '../constants.js';
|
|
15
|
+
import { setDerivationPath } from '../state.js';
|
|
16
|
+
import {
|
|
17
|
+
getEthereumAccounts,
|
|
18
|
+
standardizeAndThrowLedgerError,
|
|
19
|
+
} from '../utils.js';
|
|
20
|
+
|
|
21
|
+
const connect = builders
|
|
22
|
+
.connect()
|
|
23
|
+
.action(async function (_context, _chain, options) {
|
|
24
|
+
if (!options?.derivationPath) {
|
|
25
|
+
throw new Error('Derivation Path can not be empty.');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
setDerivationPath(options.derivationPath);
|
|
29
|
+
|
|
30
|
+
const result = await getEthereumAccounts();
|
|
31
|
+
|
|
32
|
+
const formatAccounts = result.accounts.map(
|
|
33
|
+
(account) =>
|
|
34
|
+
CAIP.AccountId.format({
|
|
35
|
+
address: account,
|
|
36
|
+
chainId: {
|
|
37
|
+
namespace: CAIP_NAMESPACE,
|
|
38
|
+
reference: result.chainId,
|
|
39
|
+
},
|
|
40
|
+
}) as CaipAccount
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
accounts: formatAccounts,
|
|
45
|
+
network: result.chainId,
|
|
46
|
+
};
|
|
47
|
+
})
|
|
48
|
+
.or(standardizeAndThrowLedgerError)
|
|
49
|
+
.build();
|
|
50
|
+
|
|
51
|
+
const disconnect = commonBuilders.disconnect<EvmActions>().build();
|
|
52
|
+
|
|
53
|
+
const evm = new NamespaceBuilder<EvmActions>('EVM', WALLET_ID)
|
|
54
|
+
.action(connect)
|
|
55
|
+
.action(disconnect)
|
|
56
|
+
.build();
|
|
57
|
+
|
|
58
|
+
export { evm };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { CaipAccount } from '@rango-dev/wallets-core/namespaces/common';
|
|
2
|
+
import type { SolanaActions } from '@rango-dev/wallets-core/namespaces/solana';
|
|
3
|
+
|
|
4
|
+
import { NamespaceBuilder } from '@rango-dev/wallets-core';
|
|
5
|
+
import { builders as commonBuilders } from '@rango-dev/wallets-core/namespaces/common';
|
|
6
|
+
import {
|
|
7
|
+
builders,
|
|
8
|
+
CAIP_NAMESPACE,
|
|
9
|
+
} from '@rango-dev/wallets-core/namespaces/solana';
|
|
10
|
+
import { CAIP } from '@rango-dev/wallets-core/utils';
|
|
11
|
+
|
|
12
|
+
import { WALLET_ID } from '../constants.js';
|
|
13
|
+
import { setDerivationPath } from '../state.js';
|
|
14
|
+
import { getSolanaAccounts, standardizeAndThrowLedgerError } from '../utils.js';
|
|
15
|
+
|
|
16
|
+
const connect = builders
|
|
17
|
+
.connect()
|
|
18
|
+
.action(async function (_context, options) {
|
|
19
|
+
if (!options?.derivationPath) {
|
|
20
|
+
throw new Error('Derivation Path can not be empty.');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
setDerivationPath(options.derivationPath);
|
|
24
|
+
|
|
25
|
+
const result = await getSolanaAccounts();
|
|
26
|
+
|
|
27
|
+
const formatAccounts = result.accounts.map(
|
|
28
|
+
(account) =>
|
|
29
|
+
CAIP.AccountId.format({
|
|
30
|
+
address: account,
|
|
31
|
+
chainId: {
|
|
32
|
+
namespace: CAIP_NAMESPACE,
|
|
33
|
+
reference: result.chainId,
|
|
34
|
+
},
|
|
35
|
+
}) as CaipAccount
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
return formatAccounts;
|
|
39
|
+
})
|
|
40
|
+
.or(standardizeAndThrowLedgerError)
|
|
41
|
+
.build();
|
|
42
|
+
|
|
43
|
+
const disconnect = commonBuilders.disconnect<SolanaActions>().build();
|
|
44
|
+
|
|
45
|
+
const solana = new NamespaceBuilder<SolanaActions>('Solana', WALLET_ID)
|
|
46
|
+
.action(connect)
|
|
47
|
+
.action(disconnect)
|
|
48
|
+
.build();
|
|
49
|
+
|
|
50
|
+
export { solana };
|
package/src/provider.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ProviderBuilder } from '@rango-dev/wallets-core';
|
|
2
|
+
|
|
3
|
+
import { metadata, WALLET_ID } from './constants.js';
|
|
4
|
+
import { evm } from './namespaces/evm.js';
|
|
5
|
+
import { solana } from './namespaces/solana.js';
|
|
6
|
+
import { ledger as ledgerInstance } from './utils.js';
|
|
7
|
+
|
|
8
|
+
const buildProvider = () =>
|
|
9
|
+
new ProviderBuilder(WALLET_ID)
|
|
10
|
+
.init(function (context) {
|
|
11
|
+
const [, setState] = context.state();
|
|
12
|
+
|
|
13
|
+
if (ledgerInstance()) {
|
|
14
|
+
setState('installed', true);
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
.config('metadata', metadata)
|
|
18
|
+
.add('solana', solana)
|
|
19
|
+
.add('evm', evm)
|
|
20
|
+
.build();
|
|
21
|
+
|
|
22
|
+
export { buildProvider };
|
package/src/signers/ethereum.ts
CHANGED
|
@@ -7,12 +7,12 @@ import { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/wallets-shared';
|
|
|
7
7
|
import { JsonRpcProvider, Transaction } from 'ethers';
|
|
8
8
|
import { SignerError, SignerErrorCode } from 'rango-types';
|
|
9
9
|
|
|
10
|
+
import { getDerivationPath } from '../state.js';
|
|
10
11
|
import {
|
|
11
12
|
getLedgerError,
|
|
12
13
|
transportConnect,
|
|
13
14
|
transportDisconnect,
|
|
14
|
-
} from '../
|
|
15
|
-
import { getDerivationPath } from '../state.js';
|
|
15
|
+
} from '../utils.js';
|
|
16
16
|
|
|
17
17
|
export class EthereumSigner implements GenericSigner<EvmTransaction> {
|
|
18
18
|
async signMessage(msg: string): Promise<string> {
|
package/src/signers/solana.ts
CHANGED
|
@@ -7,12 +7,12 @@ import { generalSolanaTransactionExecutor } from '@rango-dev/signer-solana';
|
|
|
7
7
|
import { PublicKey } from '@solana/web3.js';
|
|
8
8
|
import { SignerError, SignerErrorCode } from 'rango-types';
|
|
9
9
|
|
|
10
|
+
import { getDerivationPath } from '../state.js';
|
|
10
11
|
import {
|
|
11
12
|
getLedgerError,
|
|
12
13
|
transportConnect,
|
|
13
14
|
transportDisconnect,
|
|
14
|
-
} from '../
|
|
15
|
-
import { getDerivationPath } from '../state.js';
|
|
15
|
+
} from '../utils.js';
|
|
16
16
|
|
|
17
17
|
export function isVersionedTransaction(
|
|
18
18
|
transaction: Transaction | VersionedTransaction
|
|
@@ -1,17 +1,32 @@
|
|
|
1
1
|
import type Transport from '@ledgerhq/hw-transport';
|
|
2
2
|
|
|
3
3
|
import { getAltStatusMessage } from '@ledgerhq/errors';
|
|
4
|
+
import { LegacyNetworks } from '@rango-dev/wallets-core/legacy';
|
|
5
|
+
import { CAIP_SOLANA_CHAIN_ID } from '@rango-dev/wallets-core/namespaces/solana';
|
|
4
6
|
import {
|
|
5
7
|
dynamicImportWithRefinedError,
|
|
6
8
|
ETHEREUM_CHAIN_ID,
|
|
7
|
-
Networks,
|
|
8
9
|
type ProviderConnectResult,
|
|
9
10
|
} from '@rango-dev/wallets-shared';
|
|
10
11
|
import bs58 from 'bs58';
|
|
11
12
|
|
|
13
|
+
import { HEXADECIMAL_BASE } from './constants.js';
|
|
12
14
|
import { getDerivationPath } from './state.js';
|
|
13
15
|
|
|
14
|
-
export
|
|
16
|
+
export type Provider = Map<string, unknown>;
|
|
17
|
+
|
|
18
|
+
export function ledger(): Provider | null {
|
|
19
|
+
/*
|
|
20
|
+
* Instances have a required property which is `chainId` and is using in swap execution.
|
|
21
|
+
* Here we are setting it as Ethereum always since we are supporting only eth for now.
|
|
22
|
+
*/
|
|
23
|
+
const instances = new Map();
|
|
24
|
+
|
|
25
|
+
instances.set(LegacyNetworks.ETHEREUM, { chainId: ETHEREUM_CHAIN_ID });
|
|
26
|
+
instances.set(LegacyNetworks.SOLANA, { chainId: LegacyNetworks.SOLANA });
|
|
27
|
+
|
|
28
|
+
return instances;
|
|
29
|
+
}
|
|
15
30
|
|
|
16
31
|
const ledgerFrequentErrorMessages: { [statusCode: number]: string } = {
|
|
17
32
|
0x5515: 'The device is locked',
|
|
@@ -43,17 +58,8 @@ export function getLedgerError(error: any) {
|
|
|
43
58
|
return error;
|
|
44
59
|
}
|
|
45
60
|
|
|
46
|
-
export function
|
|
47
|
-
|
|
48
|
-
* Instances have a required property which is `chainId` and is using in swap execution.
|
|
49
|
-
* Here we are setting it as Ethereum always since we are supporting only eth for now.
|
|
50
|
-
*/
|
|
51
|
-
const instances = new Map();
|
|
52
|
-
|
|
53
|
-
instances.set(Networks.ETHEREUM, { chainId: ETHEREUM_CHAIN_ID });
|
|
54
|
-
instances.set(Networks.SOLANA, { chainId: Networks.SOLANA });
|
|
55
|
-
|
|
56
|
-
return instances;
|
|
61
|
+
export function standardizeAndThrowLedgerError(_: unknown, error: unknown) {
|
|
62
|
+
throw getLedgerError(error);
|
|
57
63
|
}
|
|
58
64
|
|
|
59
65
|
export async function getEthereumAccounts(): Promise<ProviderConnectResult> {
|
|
@@ -77,7 +83,7 @@ export async function getEthereumAccounts(): Promise<ProviderConnectResult> {
|
|
|
77
83
|
chainId: ETHEREUM_CHAIN_ID,
|
|
78
84
|
derivationPath,
|
|
79
85
|
};
|
|
80
|
-
} catch (error) {
|
|
86
|
+
} catch (error: unknown) {
|
|
81
87
|
throw getLedgerError(error);
|
|
82
88
|
} finally {
|
|
83
89
|
await transportDisconnect();
|
|
@@ -102,10 +108,10 @@ export async function getSolanaAccounts(): Promise<ProviderConnectResult> {
|
|
|
102
108
|
|
|
103
109
|
return {
|
|
104
110
|
accounts: accounts,
|
|
105
|
-
chainId:
|
|
111
|
+
chainId: CAIP_SOLANA_CHAIN_ID,
|
|
106
112
|
derivationPath,
|
|
107
113
|
};
|
|
108
|
-
} catch (error) {
|
|
114
|
+
} catch (error: unknown) {
|
|
109
115
|
throw getLedgerError(error);
|
|
110
116
|
} finally {
|
|
111
117
|
await transportDisconnect();
|
package/dist/chunk-PVLX7NBP.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as n,m as c}from"./chunk-CVKDPNYM.js";var d="";function A(t){d=t}n(A,"setDerivationPath");function u(){return d}n(u,"getDerivationPath");import{dynamicImportWithRefinedError as f,ETHEREUM_CHAIN_ID as l,Networks as a}from"@rango-dev/wallets-shared";import m from"bs58";var y=16,p={21781:"The device is locked",25871:"Related application is not ready on your device",27013:"Action denied by user"};function E(t){return p[t]?p[t]:c(t)?c(t):`Ledger device unknown error 0x${t.toString(y)}`}n(E,"getLedgerErrorMessage");function g(t){return t?.statusCode?new Error(E(t.statusCode)):t?.code==="INSUFFICIENT_FUNDS"?new Error("Insufficient funds for transaction"):t}n(g,"getLedgerError");function N(){let t=new Map;return t.set(a.ETHEREUM,{chainId:l}),t.set(a.SOLANA,{chainId:a.SOLANA}),t}n(N,"getLedgerInstance");async function C(){try{let t=await w(),r=u(),i=new(await f(async()=>await import("./Eth-5PCPPYSI.js"))).default(t),e=[],s=await i.getAddress(r,!1,!0);return e.push(s.address),{accounts:e,chainId:l,derivationPath:r}}catch(t){throw g(t)}finally{await h()}}n(C,"getEthereumAccounts");async function D(){try{let t=await w(),r=u(),i=new(await f(async()=>await import("./Solana-NJS3LWGA.js"))).default(t),e=[],s=await i.getAddress(r);return e.push(m.encode(s.address)),{accounts:e,chainId:a.SOLANA,derivationPath:r}}catch(t){throw g(t)}finally{await h()}}n(D,"getSolanaAccounts");var o=null;async function w(){return o=await(await import("./TransportWebHID-JLT4ETY3.js")).default.create(),o}n(w,"transportConnect");async function h(){o&&(await o.close(),o=null)}n(h,"transportDisconnect");export{A as a,u as b,g as c,N as d,C as e,D as f,w as g,h};
|
|
2
|
-
//# sourceMappingURL=chunk-PVLX7NBP.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/state.ts", "../src/helpers.ts"],
|
|
4
|
-
"sourcesContent": ["// We keep derivationPath here because we need to maintain it for signing transactions after it is set in connect method\nlet derivationPath = '';\n\nexport function setDerivationPath(path: string) {\n derivationPath = path;\n}\n\nexport function getDerivationPath() {\n return derivationPath;\n}\n", "import type Transport from '@ledgerhq/hw-transport';\n\nimport { getAltStatusMessage } from '@ledgerhq/errors';\nimport {\n dynamicImportWithRefinedError,\n ETHEREUM_CHAIN_ID,\n Networks,\n type ProviderConnectResult,\n} from '@rango-dev/wallets-shared';\nimport bs58 from 'bs58';\n\nimport { getDerivationPath } from './state.js';\n\nexport const HEXADECIMAL_BASE = 16;\n\nconst ledgerFrequentErrorMessages: { [statusCode: number]: string } = {\n 0x5515: 'The device is locked',\n 0x650f: 'Related application is not ready on your device',\n 0x6985: 'Action denied by user',\n};\n\nfunction getLedgerErrorMessage(statusCode: number): string {\n if (ledgerFrequentErrorMessages[statusCode]) {\n return ledgerFrequentErrorMessages[statusCode];\n } else if (getAltStatusMessage(statusCode)) {\n return getAltStatusMessage(statusCode) as string;\n }\n\n return `Ledger device unknown error 0x${statusCode.toString(\n HEXADECIMAL_BASE\n )}`; // Hexadecimal numbers are more commonly recognized and utilized for representing ledger error codes\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getLedgerError(error: any) {\n if (error?.statusCode) {\n return new Error(getLedgerErrorMessage(error.statusCode));\n }\n\n if (error?.code === 'INSUFFICIENT_FUNDS') {\n return new Error('Insufficient funds for transaction');\n }\n return error;\n}\n\nexport function getLedgerInstance() {\n /*\n * Instances have a required property which is `chainId` and is using in swap execution.\n * Here we are setting it as Ethereum always since we are supporting only eth for now.\n */\n const instances = new Map();\n\n instances.set(Networks.ETHEREUM, { chainId: ETHEREUM_CHAIN_ID });\n instances.set(Networks.SOLANA, { chainId: Networks.SOLANA });\n\n return instances;\n}\n\nexport async function getEthereumAccounts(): Promise<ProviderConnectResult> {\n try {\n const transport = await transportConnect();\n const derivationPath = getDerivationPath();\n\n const eth = new (\n await dynamicImportWithRefinedError(\n async () => await import('@ledgerhq/hw-app-eth')\n )\n ).default(transport);\n\n const accounts: string[] = [];\n\n const result = await eth.getAddress(derivationPath, false, true);\n accounts.push(result.address);\n\n return {\n accounts: accounts,\n chainId: ETHEREUM_CHAIN_ID,\n derivationPath,\n };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n}\n\nexport async function getSolanaAccounts(): Promise<ProviderConnectResult> {\n try {\n const transport = await transportConnect();\n const derivationPath = getDerivationPath();\n\n const solana = new (\n await dynamicImportWithRefinedError(\n async () => await import('@ledgerhq/hw-app-solana')\n )\n ).default(transport);\n\n const accounts: string[] = [];\n\n const result = await solana.getAddress(derivationPath);\n accounts.push(bs58.encode(result.address));\n\n return {\n accounts: accounts,\n chainId: Networks.SOLANA,\n derivationPath,\n };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n}\n\nlet transportConnection: Transport | null = null;\n\nexport async function transportConnect() {\n transportConnection = await (\n await import('@ledgerhq/hw-transport-webhid')\n ).default.create();\n\n return transportConnection;\n}\n\nexport async function transportDisconnect() {\n if (transportConnection) {\n await transportConnection.close();\n transportConnection = null;\n }\n}\n"],
|
|
5
|
-
"mappings": "+CACA,IAAIA,EAAiB,GAEd,SAASC,EAAkBC,EAAc,CAC9CF,EAAiBE,CACnB,CAFgBC,EAAAF,EAAA,qBAIT,SAASG,GAAoB,CAClC,OAAOJ,CACT,CAFgBG,EAAAC,EAAA,qBCJhB,OACE,iCAAAC,EACA,qBAAAC,EACA,YAAAC,MAEK,4BACP,OAAOC,MAAU,OAIV,IAAMC,EAAmB,GAE1BC,EAAgE,CACpE,MAAQ,uBACR,MAAQ,kDACR,MAAQ,uBACV,EAEA,SAASC,EAAsBC,EAA4B,CACzD,OAAIF,EAA4BE,CAAU,EACjCF,EAA4BE,CAAU,EACpCC,EAAoBD,CAAU,EAChCC,EAAoBD,CAAU,EAGhC,iCAAiCA,EAAW,SACjDH,CACF,CAAC,EACH,CAVSK,EAAAH,EAAA,yBAaF,SAASI,EAAeC,EAAY,CACzC,OAAIA,GAAO,WACF,IAAI,MAAML,EAAsBK,EAAM,UAAU,CAAC,EAGtDA,GAAO,OAAS,qBACX,IAAI,MAAM,oCAAoC,EAEhDA,CACT,CATgBF,EAAAC,EAAA,kBAWT,SAASE,GAAoB,CAKlC,IAAMC,EAAY,IAAI,IAEtB,OAAAA,EAAU,IAAIC,EAAS,SAAU,CAAE,QAASC,CAAkB,CAAC,EAC/DF,EAAU,IAAIC,EAAS,OAAQ,CAAE,QAASA,EAAS,MAAO,CAAC,EAEpDD,CACT,CAXgBJ,EAAAG,EAAA,qBAahB,eAAsBI,GAAsD,CAC1E,GAAI,CACF,IAAMC,EAAY,MAAMC,EAAiB,EACnCC,EAAiBC,EAAkB,EAEnCC,EAAM,IACV,MAAMC,EACJ,SAAY,KAAM,QAAO,mBAAsB,CACjD,GACA,QAAQL,CAAS,EAEbM,EAAqB,CAAC,EAEtBC,EAAS,MAAMH,EAAI,WAAWF,EAAgB,GAAO,EAAI,EAC/D,OAAAI,EAAS,KAAKC,EAAO,OAAO,EAErB,CACL,SAAUD,EACV,QAASR,EACT,eAAAI,CACF,CACF,OAASR,EAAO,CACd,MAAMD,EAAeC,CAAK,CAC5B,QAAE,CACA,MAAMc,EAAoB,CAC5B,CACF,CA1BsBhB,EAAAO,EAAA,uBA4BtB,eAAsBU,GAAoD,CACxE,GAAI,CACF,IAAMT,EAAY,MAAMC,EAAiB,EACnCC,EAAiBC,EAAkB,EAEnCO,EAAS,IACb,MAAML,EACJ,SAAY,KAAM,QAAO,sBAAyB,CACpD,GACA,QAAQL,CAAS,EAEbM,EAAqB,CAAC,EAEtBC,EAAS,MAAMG,EAAO,WAAWR,CAAc,EACrD,OAAAI,EAAS,KAAKK,EAAK,OAAOJ,EAAO,OAAO,CAAC,EAElC,CACL,SAAUD,EACV,QAAST,EAAS,OAClB,eAAAK,CACF,CACF,OAASR,EAAO,CACd,MAAMD,EAAeC,CAAK,CAC5B,QAAE,CACA,MAAMc,EAAoB,CAC5B,CACF,CA1BsBhB,EAAAiB,EAAA,qBA4BtB,IAAIG,EAAwC,KAE5C,eAAsBX,GAAmB,CACvC,OAAAW,EAAsB,MACpB,KAAM,QAAO,+BAA+B,GAC5C,QAAQ,OAAO,EAEVA,CACT,CANsBpB,EAAAS,EAAA,oBAQtB,eAAsBO,GAAsB,CACtCI,IACF,MAAMA,EAAoB,MAAM,EAChCA,EAAsB,KAE1B,CALsBpB,EAAAgB,EAAA",
|
|
6
|
-
"names": ["derivationPath", "setDerivationPath", "path", "__name", "getDerivationPath", "dynamicImportWithRefinedError", "ETHEREUM_CHAIN_ID", "Networks", "bs58", "HEXADECIMAL_BASE", "ledgerFrequentErrorMessages", "getLedgerErrorMessage", "statusCode", "getAltStatusMessage", "__name", "getLedgerError", "error", "getLedgerInstance", "instances", "Networks", "ETHEREUM_CHAIN_ID", "getEthereumAccounts", "transport", "transportConnect", "derivationPath", "getDerivationPath", "eth", "dynamicImportWithRefinedError", "accounts", "result", "transportDisconnect", "getSolanaAccounts", "solana", "bs58", "transportConnection"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/signers/ethereum.ts"],
|
|
4
|
-
"sourcesContent": ["import type { TransactionLike } from 'ethers';\nimport type { GenericSigner } from 'rango-types';\nimport type { EvmTransaction } from 'rango-types/mainApi';\n\nimport Eth, { ledgerService } from '@ledgerhq/hw-app-eth';\nimport { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/wallets-shared';\nimport { JsonRpcProvider, Transaction } from 'ethers';\nimport { SignerError, SignerErrorCode } from 'rango-types';\n\nimport {\n getLedgerError,\n transportConnect,\n transportDisconnect,\n} from '../helpers.js';\nimport { getDerivationPath } from '../state.js';\n\nexport class EthereumSigner implements GenericSigner<EvmTransaction> {\n async signMessage(msg: string): Promise<string> {\n try {\n const transport = await transportConnect();\n\n const eth = new Eth(transport);\n const result = await eth.signPersonalMessage(\n getDerivationPath(),\n Buffer.from(msg).toString('hex')\n );\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n let v = (result['v'] - 27).toString(16);\n if (v.length < 2) {\n v = '0' + v;\n }\n return '0x' + result['r'] + result['s'] + v;\n } catch (error) {\n throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, error);\n }\n }\n\n async signAndSendTx(\n tx: EvmTransaction,\n fromAddress: string,\n chainId: string | null\n ): Promise<{ hash: string }> {\n try {\n const provider = new JsonRpcProvider(DEFAULT_ETHEREUM_RPC_URL); // Provider to broadcast transaction\n\n const transactionCount = await provider.getTransactionCount(fromAddress); // Get nonce\n\n const transaction: TransactionLike<string> = {\n to: tx.to,\n gasPrice: tx.gasPrice,\n gasLimit: tx.gasLimit,\n nonce: transactionCount,\n chainId: chainId,\n data: tx.data,\n value: tx.value,\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas,\n maxFeePerGas: tx.maxFeePerGas,\n };\n\n const unsignedTx =\n Transaction.from(transaction).unsignedSerialized.substring(2); // Create unsigned transaction\n\n const resolution = await ledgerService.resolveTransaction(\n unsignedTx,\n {},\n {}\n ); // metadata necessary to allow the device to clear sign information\n\n const transport = await transportConnect();\n\n const eth = new Eth(transport);\n\n const signature = await eth.signTransaction(\n getDerivationPath(),\n unsignedTx,\n resolution\n );\n\n const signedTx = Transaction.from({\n ...transaction,\n signature: {\n r: '0x' + signature.r,\n s: '0x' + signature.s,\n v: parseInt(signature.v),\n },\n }).serialized;\n\n const broadcastResult = await provider.broadcastTransaction(signedTx);\n\n return { hash: broadcastResult.hash };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "gLAKA,OAAS,4BAAAA,MAAgC,4BACzC,OAAS,mBAAAC,EAAiB,eAAAC,MAAmB,SAC7C,OAAS,eAAAC,EAAa,mBAAAC,MAAuB,cAStC,IAAMC,EAAN,KAA8D,CAhBrE,MAgBqE,CAAAC,EAAA,uBACnE,MAAM,YAAYC,EAA8B,CAC9C,GAAI,CACF,IAAMC,EAAY,MAAMC,EAAiB,EAGnCC,EAAS,MADH,IAAIC,EAAIH,CAAS,EACJ,oBACvBI,EAAkB,EAClB,OAAO,KAAKL,CAAG,EAAE,SAAS,KAAK,CACjC,EAEIM,GAAKH,EAAO,EAAO,IAAI,SAAS,EAAE,EACtC,OAAIG,EAAE,OAAS,IACbA,EAAI,IAAMA,GAEL,KAAOH,EAAO,EAAOA,EAAO,EAAOG,CAC5C,OAASC,EAAO,CACd,MAAM,IAAIC,EAAYC,EAAgB,cAAe,OAAWF,CAAK,CACvE,CACF,CAEA,MAAM,cACJG,EACAC,EACAC,EAC2B,CAC3B,GAAI,CACF,IAAMC,EAAW,IAAIC,EAAgBC,CAAwB,EAEvDC,EAAmB,MAAMH,EAAS,oBAAoBF,CAAW,EAEjEM,EAAuC,CAC3C,GAAIP,EAAG,GACP,SAAUA,EAAG,SACb,SAAUA,EAAG,SACb,MAAOM,EACP,QAASJ,EACT,KAAMF,EAAG,KACT,MAAOA,EAAG,MACV,qBAAsBA,EAAG,qBACzB,aAAcA,EAAG,YACnB,EAEMQ,EACJC,EAAY,KAAKF,CAAW,EAAE,mBAAmB,UAAU,CAAC,EAExDG,EAAa,MAAMC,EAAc,mBACrCH,EACA,CAAC,EACD,CAAC,CACH,EAEMjB,EAAY,MAAMC,EAAiB,EAInCoB,EAAY,MAFN,IAAIlB,EAAIH,CAAS,EAED,gBAC1BI,EAAkB,EAClBa,EACAE,CACF,EAEMG,EAAWJ,EAAY,KAAK,CAChC,GAAGF,EACH,UAAW,CACT,EAAG,KAAOK,EAAU,EACpB,EAAG,KAAOA,EAAU,EACpB,EAAG,SAASA,EAAU,CAAC,CACzB,CACF,CAAC,EAAE,WAIH,MAAO,CAAE,MAFe,MAAMT,EAAS,qBAAqBU,CAAQ,GAErC,IAAK,CACtC,OAAShB,EAAO,CACd,MAAMiB,EAAejB,CAAK,CAC5B,QAAE,CACA,MAAMkB,EAAoB,CAC5B,CACF,CACF",
|
|
6
|
-
"names": ["DEFAULT_ETHEREUM_RPC_URL", "JsonRpcProvider", "Transaction", "SignerError", "SignerErrorCode", "EthereumSigner", "__name", "msg", "transport", "transportConnect", "result", "Eth", "getDerivationPath", "v", "error", "SignerError", "SignerErrorCode", "tx", "fromAddress", "chainId", "provider", "JsonRpcProvider", "DEFAULT_ETHEREUM_RPC_URL", "transactionCount", "transaction", "unsignedTx", "Transaction", "resolution", "ledger_default", "signature", "signedTx", "getLedgerError", "transportDisconnect"]
|
|
7
|
-
}
|
package/dist/index.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as c,d as p,e as m,f as g,h as d}from"./chunk-PVLX7NBP.js";import{a as r}from"./chunk-CVKDPNYM.js";import{Networks as i,WalletTypes as f}from"@rango-dev/wallets-shared";import"rango-types";import{dynamicImportWithRefinedError as h}from"@rango-dev/wallets-shared";import{DefaultSignerFactory as y,TransactionType as u}from"rango-types";async function l(){let t=new y,{EthereumSigner:a}=await h(async()=>await import("./ethereum-NIQRUD6P.js")),{SolanaSigner:n}=await h(async()=>await import("./solana-CMBORE4C.js"));return t.registerSigner(u.EVM,new a),t.registerSigner(u.SOLANA,new n),t}r(l,"getSigners");var b={type:f.LEDGER},k=p,A=r(async({namespaces:t})=>{let a=[],n=t?.find(e=>e.namespace==="Solana"),o=t?.find(e=>e.namespace==="EVM");if(n)if(n.derivationPath){c(n.derivationPath);let e=await g();a.push(e)}else throw new Error("Derivation Path can not be empty.");else if(o)if(o.derivationPath){c(o.derivationPath);let e=await m();a.push(e)}else throw new Error("Derivation Path can not be empty.");else throw new Error(`It appears that you have selected a namespace that is not yet supported by our system. Your namespaces: ${t?.map(e=>e.namespace)}`);return a},"connect"),T=r(async()=>{d()},"disconnect"),I=l,N=r(t=>{let a=[],n=t.find(e=>e.name===i.ETHEREUM);n&&a.push(n);let o=t.find(e=>e.name===i.SOLANA);return o&&a.push(o),{name:"Ledger",img:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/ledger/icon.svg",installLink:{DEFAULT:"https://support.ledger.com/hc/en-us/articles/4404389606417-Download-and-install-Ledger-Live?docs=true"},color:"black",supportedChains:a,showOnMobile:!1,needsDerivationPath:{data:[{id:"metamask",label:"Metamask (m/44'/60'/0'/0/index)",namespace:"EVM",generateDerivationPath:e=>`44'/60'/0'/0/${e}`},{id:"ledgerLive",label:"LedgerLive (m/44'/60'/index'/0/0)",namespace:"EVM",generateDerivationPath:e=>`44'/60'/${e}'/0/0`},{id:"legacy",label:"Legacy (m/44'/60'/0'/index)",namespace:"EVM",generateDerivationPath:e=>`44'/60'/0'/${e}`},{id:"(m/44'/501'/index')",label:"(m/44'/501'/index')",namespace:"Solana",generateDerivationPath:e=>`44'/501'/${e}'`},{id:"(m/44'/501'/0'/index)",label:"(m/44'/501'/0'/index)",namespace:"Solana",generateDerivationPath:e=>`44'/501'/0'/${e}`}]},needsNamespace:{selection:"single",data:[{label:"EVM",value:"EVM",id:"ETH",getSupportedChains:e=>e.filter(s=>s.name===i.ETHEREUM)},{label:"Solana",value:"Solana",id:"SOLANA",getSupportedChains:e=>e.filter(s=>s.name===i.SOLANA)}]}}},"getWalletInfo");export{b as config,A as connect,T as disconnect,k as getInstance,I as getSigners,N as getWalletInfo};
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/signer.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n Connect,\n Disconnect,\n ProviderConnectResult,\n WalletInfo,\n} from '@rango-dev/wallets-shared';\n\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport { type BlockchainMeta, type SignerFactory } from 'rango-types';\n\nimport {\n getEthereumAccounts,\n getLedgerInstance,\n getSolanaAccounts,\n transportDisconnect,\n} from './helpers.js';\nimport signer from './signer.js';\nimport { setDerivationPath } from './state.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InstanceType = any;\n\nexport const config = {\n type: WalletTypes.LEDGER,\n};\n\nexport const getInstance = getLedgerInstance;\nexport const connect: Connect = async ({ namespaces }) => {\n const results: ProviderConnectResult[] = [];\n\n const solanaNamespace = namespaces?.find(\n (namespaceItem) => namespaceItem.namespace === 'Solana'\n );\n const evmNamespace = namespaces?.find(\n (namespaceItem) => namespaceItem.namespace === 'EVM'\n );\n\n if (solanaNamespace) {\n if (solanaNamespace.derivationPath) {\n setDerivationPath(solanaNamespace.derivationPath);\n const accounts = await getSolanaAccounts();\n results.push(accounts);\n } else {\n throw new Error('Derivation Path can not be empty.');\n }\n } else if (evmNamespace) {\n if (evmNamespace.derivationPath) {\n setDerivationPath(evmNamespace.derivationPath);\n const accounts = await getEthereumAccounts();\n results.push(accounts);\n } else {\n throw new Error('Derivation Path can not be empty.');\n }\n } else {\n throw new Error(\n `It appears that you have selected a namespace that is not yet supported by our system. Your namespaces: ${namespaces?.map(\n (namespaceItem) => namespaceItem.namespace\n )}`\n );\n }\n\n return results;\n};\n\nexport const disconnect: Disconnect = async () => {\n void transportDisconnect();\n};\n\nexport const getSigners: (provider: InstanceType) => Promise<SignerFactory> =\n signer;\n\nexport const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (\n allBlockChains\n) => {\n const supportedChains: BlockchainMeta[] = [];\n\n const ethereumBlockchain = allBlockChains.find(\n (chain) => chain.name === Networks.ETHEREUM\n );\n if (ethereumBlockchain) {\n supportedChains.push(ethereumBlockchain);\n }\n\n const solanaBlockchain = allBlockChains.find(\n (chain) => chain.name === Networks.SOLANA\n );\n if (solanaBlockchain) {\n supportedChains.push(solanaBlockchain);\n }\n\n return {\n name: 'Ledger',\n img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/ledger/icon.svg',\n installLink: {\n DEFAULT:\n 'https://support.ledger.com/hc/en-us/articles/4404389606417-Download-and-install-Ledger-Live?docs=true',\n },\n color: 'black',\n supportedChains,\n showOnMobile: false,\n needsDerivationPath: {\n data: [\n {\n id: 'metamask',\n label: `Metamask (m/44'/60'/0'/0/index)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/0'/0/${index}`,\n },\n {\n id: 'ledgerLive',\n label: `LedgerLive (m/44'/60'/index'/0/0)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/${index}'/0/0`,\n },\n {\n id: 'legacy',\n label: `Legacy (m/44'/60'/0'/index)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/0'/${index}`,\n },\n {\n id: `(m/44'/501'/index')`,\n label: `(m/44'/501'/index')`,\n namespace: 'Solana',\n generateDerivationPath: (index: string) => `44'/501'/${index}'`,\n },\n {\n id: `(m/44'/501'/0'/index)`,\n label: `(m/44'/501'/0'/index)`,\n namespace: 'Solana',\n generateDerivationPath: (index: string) => `44'/501'/0'/${index}`,\n },\n ],\n },\n\n needsNamespace: {\n selection: 'single',\n data: [\n {\n label: 'EVM',\n value: 'EVM',\n id: 'ETH',\n getSupportedChains: (allBlockchains: BlockchainMeta[]) =>\n allBlockchains.filter((chain) => chain.name === Networks.ETHEREUM),\n },\n {\n label: 'Solana',\n value: 'Solana',\n id: 'SOLANA',\n getSupportedChains: (allBlockchains: BlockchainMeta[]) =>\n allBlockchains.filter((chain) => chain.name === Networks.SOLANA),\n },\n ],\n },\n };\n};\n", "import type { SignerFactory } from 'rango-types';\n\nimport { dynamicImportWithRefinedError } from '@rango-dev/wallets-shared';\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nexport default async function getSigners(): Promise<SignerFactory> {\n const signers = new DefaultSignerFactory();\n const { EthereumSigner } = await dynamicImportWithRefinedError(\n async () => await import('./signers/ethereum.js')\n );\n const { SolanaSigner } = await dynamicImportWithRefinedError(\n async () => await import('./signers/solana.js')\n );\n signers.registerSigner(TxType.EVM, new EthereumSigner());\n signers.registerSigner(TxType.SOLANA, new SolanaSigner());\n return signers;\n}\n"],
|
|
5
|
-
"mappings": "4GAOA,OAAS,YAAAA,EAAU,eAAAC,MAAmB,4BACtC,MAAwD,cCNxD,OAAS,iCAAAC,MAAqC,4BAC9C,OAAS,wBAAAC,EAAsB,mBAAmBC,MAAc,cAEhE,eAAOC,GAA4D,CACjE,IAAMC,EAAU,IAAIC,EACd,CAAE,eAAAC,CAAe,EAAI,MAAMC,EAC/B,SAAY,KAAM,QAAO,wBAAuB,CAClD,EACM,CAAE,aAAAC,CAAa,EAAI,MAAMD,EAC7B,SAAY,KAAM,QAAO,sBAAqB,CAChD,EACA,OAAAH,EAAQ,eAAeK,EAAO,IAAK,IAAIH,CAAgB,EACvDF,EAAQ,eAAeK,EAAO,OAAQ,IAAID,CAAc,EACjDJ,CACT,CAX8BM,EAAAP,EAAA,cDiBvB,IAAMQ,EAAS,CACpB,KAAMC,EAAY,MACpB,EAEaC,EAAcC,EACdC,EAAmBC,EAAA,MAAO,CAAE,WAAAC,CAAW,IAAM,CACxD,IAAMC,EAAmC,CAAC,EAEpCC,EAAkBF,GAAY,KACjCG,GAAkBA,EAAc,YAAc,QACjD,EACMC,EAAeJ,GAAY,KAC9BG,GAAkBA,EAAc,YAAc,KACjD,EAEA,GAAID,EACF,GAAIA,EAAgB,eAAgB,CAClCG,EAAkBH,EAAgB,cAAc,EAChD,IAAMI,EAAW,MAAMC,EAAkB,EACzCN,EAAQ,KAAKK,CAAQ,CACvB,KACE,OAAM,IAAI,MAAM,mCAAmC,UAE5CF,EACT,GAAIA,EAAa,eAAgB,CAC/BC,EAAkBD,EAAa,cAAc,EAC7C,IAAME,EAAW,MAAME,EAAoB,EAC3CP,EAAQ,KAAKK,CAAQ,CACvB,KACE,OAAM,IAAI,MAAM,mCAAmC,MAGrD,OAAM,IAAI,MACR,2GAA2GN,GAAY,IACpHG,GAAkBA,EAAc,SACnC,CAAC,EACH,EAGF,OAAOF,CACT,EAnCgC,WAqCnBQ,EAAyBV,EAAA,SAAY,CAC3CW,EAAoB,CAC3B,EAFsC,cAIzBC,EACXA,EAEWC,EAAkEb,EAC7Ec,GACG,CACH,IAAMC,EAAoC,CAAC,EAErCC,EAAqBF,EAAe,KACvCG,GAAUA,EAAM,OAASC,EAAS,QACrC,EACIF,GACFD,EAAgB,KAAKC,CAAkB,EAGzC,IAAMG,EAAmBL,EAAe,KACrCG,GAAUA,EAAM,OAASC,EAAS,MACrC,EACA,OAAIC,GACFJ,EAAgB,KAAKI,CAAgB,EAGhC,CACL,KAAM,SACN,IAAK,uFACL,YAAa,CACX,QACE,uGACJ,EACA,MAAO,QACP,gBAAAJ,EACA,aAAc,GACd,oBAAqB,CACnB,KAAM,CACJ,CACE,GAAI,WACJ,MAAO,kCACP,UAAW,MACX,uBAAyBK,GAAkB,gBAAgBA,CAAK,EAClE,EACA,CACE,GAAI,aACJ,MAAO,oCACP,UAAW,MACX,uBAAyBA,GAAkB,WAAWA,CAAK,OAC7D,EACA,CACE,GAAI,SACJ,MAAO,8BACP,UAAW,MACX,uBAAyBA,GAAkB,cAAcA,CAAK,EAChE,EACA,CACE,GAAI,sBACJ,MAAO,sBACP,UAAW,SACX,uBAAyBA,GAAkB,YAAYA,CAAK,GAC9D,EACA,CACE,GAAI,wBACJ,MAAO,wBACP,UAAW,SACX,uBAAyBA,GAAkB,eAAeA,CAAK,EACjE,CACF,CACF,EAEA,eAAgB,CACd,UAAW,SACX,KAAM,CACJ,CACE,MAAO,MACP,MAAO,MACP,GAAI,MACJ,mBAAqBC,GACnBA,EAAe,OAAQJ,GAAUA,EAAM,OAASC,EAAS,QAAQ,CACrE,EACA,CACE,MAAO,SACP,MAAO,SACP,GAAI,SACJ,mBAAqBG,GACnBA,EAAe,OAAQJ,GAAUA,EAAM,OAASC,EAAS,MAAM,CACnE,CACF,CACF,CACF,CACF,EApF+E",
|
|
6
|
-
"names": ["Networks", "WalletTypes", "dynamicImportWithRefinedError", "DefaultSignerFactory", "TxType", "getSigners", "signers", "DefaultSignerFactory", "EthereumSigner", "dynamicImportWithRefinedError", "SolanaSigner", "TxType", "__name", "config", "WalletTypes", "getInstance", "getLedgerInstance", "connect", "__name", "namespaces", "results", "solanaNamespace", "namespaceItem", "evmNamespace", "setDerivationPath", "accounts", "getSolanaAccounts", "getEthereumAccounts", "disconnect", "transportDisconnect", "getSigners", "getWalletInfo", "allBlockChains", "supportedChains", "ethereumBlockchain", "chain", "Networks", "solanaBlockchain", "index", "allBlockchains"]
|
|
7
|
-
}
|
package/dist/solana-CMBORE4C.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as o}from"./chunk-OOX2UCLJ.js";import{b as e,c as l,g as c,h as f}from"./chunk-PVLX7NBP.js";import{a}from"./chunk-CVKDPNYM.js";import{generalSolanaTransactionExecutor as w}from"@rango-dev/signer-solana";import{PublicKey as T}from"@solana/web3.js";import{SignerError as h,SignerErrorCode as y}from"rango-types";function x(g){return"version"in g}a(x,"isVersionedTransaction");var m=class{static{a(this,"SolanaSigner")}async signMessage(t){try{let r=await c();return(await new o(r).signOffchainMessage(e(),Buffer.from(t))).signature.toString()}catch(r){throw new h(y.SIGN_TX_ERROR,void 0,r)}}async signAndSendTx(t){try{return{hash:await w(t,a(async n=>{let p=await c(),i=new o(p),s;x(n)?s=await i.signTransaction(e(),n.message.serialize()):s=await i.signTransaction(e(),n.serialize());let u=await i.getAddress(e()),S=new T(u.address);return n.addSignature(S,Buffer.from(s.signature)),n.serialize()},"DefaultSolanaSigner"))}}catch(r){throw l(r)}finally{await f()}}};export{m as SolanaSigner,x as isVersionedTransaction};
|
|
2
|
-
//# sourceMappingURL=solana-CMBORE4C.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/signers/solana.ts"],
|
|
4
|
-
"sourcesContent": ["import type { SolanaWeb3Signer } from '@rango-dev/signer-solana';\nimport type { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport type { GenericSigner, SolanaTransaction } from 'rango-types';\n\nimport Solana from '@ledgerhq/hw-app-solana';\nimport { generalSolanaTransactionExecutor } from '@rango-dev/signer-solana';\nimport { PublicKey } from '@solana/web3.js';\nimport { SignerError, SignerErrorCode } from 'rango-types';\n\nimport {\n getLedgerError,\n transportConnect,\n transportDisconnect,\n} from '../helpers.js';\nimport { getDerivationPath } from '../state.js';\n\nexport function isVersionedTransaction(\n transaction: Transaction | VersionedTransaction\n): transaction is VersionedTransaction {\n return 'version' in transaction;\n}\n\nexport class SolanaSigner implements GenericSigner<SolanaTransaction> {\n async signMessage(msg: string): Promise<string> {\n try {\n const transport = await transportConnect();\n\n const solana = new Solana(transport);\n\n const result = await solana.signOffchainMessage(\n getDerivationPath(),\n Buffer.from(msg)\n );\n return result.signature.toString();\n } catch (error) {\n throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, error);\n }\n }\n\n async signAndSendTx(tx: SolanaTransaction): Promise<{ hash: string }> {\n try {\n const DefaultSolanaSigner: SolanaWeb3Signer = async (\n solanaWeb3Transaction: Transaction | VersionedTransaction\n ) => {\n const transport = await transportConnect();\n const solana = new Solana(transport);\n\n let signResult;\n if (isVersionedTransaction(solanaWeb3Transaction)) {\n signResult = await solana.signTransaction(\n getDerivationPath(),\n solanaWeb3Transaction.message.serialize() as Buffer\n );\n } else {\n signResult = await solana.signTransaction(\n getDerivationPath(),\n solanaWeb3Transaction.serialize()\n );\n }\n\n const addressResult = await solana.getAddress(getDerivationPath());\n\n const publicKey = new PublicKey(addressResult.address);\n\n solanaWeb3Transaction.addSignature(\n publicKey,\n Buffer.from(signResult.signature)\n );\n\n const serializedTx = solanaWeb3Transaction.serialize();\n\n return serializedTx;\n };\n const hash = await generalSolanaTransactionExecutor(\n tx,\n DefaultSolanaSigner\n );\n return { hash };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "wIAKA,OAAS,oCAAAA,MAAwC,2BACjD,OAAS,aAAAC,MAAiB,kBAC1B,OAAS,eAAAC,EAAa,mBAAAC,MAAuB,cAStC,SAASC,EACdC,EACqC,CACrC,MAAO,YAAaA,CACtB,CAJgBC,EAAAF,EAAA,0BAMT,IAAMG,EAAN,KAA+D,CAtBtE,MAsBsE,CAAAD,EAAA,qBACpE,MAAM,YAAYE,EAA8B,CAC9C,GAAI,CACF,IAAMC,EAAY,MAAMC,EAAiB,EAQzC,OAJe,MAFA,IAAIC,EAAOF,CAAS,EAEP,oBAC1BG,EAAkB,EAClB,OAAO,KAAKJ,CAAG,CACjB,GACc,UAAU,SAAS,CACnC,OAASK,EAAO,CACd,MAAM,IAAIC,EAAYC,EAAgB,cAAe,OAAWF,CAAK,CACvE,CACF,CAEA,MAAM,cAAcG,EAAkD,CACpE,GAAI,CAqCF,MAAO,CAAE,KAJI,MAAMC,EACjBD,EAjC4CV,EAAA,MAC5CY,GACG,CACH,IAAMT,EAAY,MAAMC,EAAiB,EACnCS,EAAS,IAAIR,EAAOF,CAAS,EAE/BW,EACAhB,EAAuBc,CAAqB,EAC9CE,EAAa,MAAMD,EAAO,gBACxBP,EAAkB,EAClBM,EAAsB,QAAQ,UAAU,CAC1C,EAEAE,EAAa,MAAMD,EAAO,gBACxBP,EAAkB,EAClBM,EAAsB,UAAU,CAClC,EAGF,IAAMG,EAAgB,MAAMF,EAAO,WAAWP,EAAkB,CAAC,EAE3DU,EAAY,IAAIC,EAAUF,EAAc,OAAO,EAErD,OAAAH,EAAsB,aACpBI,EACA,OAAO,KAAKF,EAAW,SAAS,CAClC,EAEqBF,EAAsB,UAAU,CAGvD,EA/B8C,sBAmC9C,CACc,CAChB,OAASL,EAAO,CACd,MAAMW,EAAeX,CAAK,CAC5B,QAAE,CACA,MAAMY,EAAoB,CAC5B,CACF,CACF",
|
|
6
|
-
"names": ["generalSolanaTransactionExecutor", "PublicKey", "SignerError", "SignerErrorCode", "isVersionedTransaction", "transaction", "__name", "SolanaSigner", "msg", "transport", "transportConnect", "Solana", "getDerivationPath", "error", "SignerError", "SignerErrorCode", "tx", "generalSolanaTransactionExecutor", "solanaWeb3Transaction", "solana", "signResult", "addressResult", "publicKey", "PublicKey", "getLedgerError", "transportDisconnect"]
|
|
7
|
-
}
|
|
File without changes
|