@rango-dev/provider-trezor 0.0.0-experimental-936229e8-20251208

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 ADDED
@@ -0,0 +1,160 @@
1
+ # [0.22.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.21.1...provider-trezor@0.22.0) (2025-12-02)
2
+
3
+
4
+
5
+ ## [0.21.1](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.21.0...provider-trezor@0.21.1) (2025-11-22)
6
+
7
+
8
+
9
+ # [0.19.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.18.0...provider-trezor@0.19.0) (2025-10-29)
10
+
11
+
12
+
13
+ # [0.18.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.17.0...provider-trezor@0.18.0) (2025-09-29)
14
+
15
+
16
+
17
+ # [0.17.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.16.0...provider-trezor@0.17.0) (2025-09-06)
18
+
19
+
20
+
21
+ # [0.16.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.15.0...provider-trezor@0.16.0) (2025-08-19)
22
+
23
+
24
+ ### Bug Fixes
25
+
26
+ * remove retry dynamic import and throw refined error on dynamic import failure ([a2944ac](https://github.com/rango-exchange/rango-client/commit/a2944ac3c05a0e945f6e5621fa5693ab89625485))
27
+
28
+
29
+ ### Features
30
+
31
+ * implement retry mechanism for lazy imports ([9a8e191](https://github.com/rango-exchange/rango-client/commit/9a8e191711d2319990ca4d0613e8188a5f86842f))
32
+
33
+
34
+
35
+ # [0.15.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.14.0...provider-trezor@0.15.0) (2025-08-05)
36
+
37
+
38
+
39
+ # [0.14.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.13.0...provider-trezor@0.14.0) (2025-07-22)
40
+
41
+
42
+ ### Features
43
+
44
+ * add derivation path to swap wallets ([0728ac4](https://github.com/rango-exchange/rango-client/commit/0728ac40a67f648d254db2461627b7cd408a28c5))
45
+
46
+
47
+ ### Reverts
48
+
49
+ * Revert "chore(release): publish" ([064ce15](https://github.com/rango-exchange/rango-client/commit/064ce157a2f819856f647f83aeb1c0410542e8d7))
50
+
51
+
52
+
53
+ # [0.12.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.11.1...provider-trezor@0.12.0) (2025-06-09)
54
+
55
+
56
+
57
+ ## [0.11.1](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.11.0...provider-trezor@0.11.1) (2025-05-04)
58
+
59
+
60
+
61
+ # [0.11.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.10.0...provider-trezor@0.11.0) (2025-04-30)
62
+
63
+
64
+ ### Bug Fixes
65
+
66
+ * rename pbt to ptb for sui ([3d6d89f](https://github.com/rango-exchange/rango-client/commit/3d6d89f2265766607a15d61e0df92643fb33072b))
67
+
68
+
69
+ ### Features
70
+
71
+ * implement updated design for initial connect modal ([2873c63](https://github.com/rango-exchange/rango-client/commit/2873c630de0740bb3b9f4e52bfa018857bd54dcd))
72
+ * update sui to consider recent api changes ([d764b25](https://github.com/rango-exchange/rango-client/commit/d764b2501df9bb295f63cdbc0b05acd4a3abb4b9))
73
+
74
+
75
+
76
+ # [0.10.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.9.0...provider-trezor@0.10.0) (2025-03-11)
77
+
78
+
79
+
80
+ # [0.9.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.8.0...provider-trezor@0.9.0) (2025-02-23)
81
+
82
+
83
+
84
+ # [0.8.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.7.0...provider-trezor@0.8.0) (2024-12-30)
85
+
86
+
87
+
88
+ # [0.7.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.6.0...provider-trezor@0.7.0) (2024-11-27)
89
+
90
+
91
+
92
+ # [0.6.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.5.0...provider-trezor@0.6.0) (2024-11-12)
93
+
94
+
95
+ ### Bug Fixes
96
+
97
+ * resolve issues with trezor provider's sign message method ([017570f](https://github.com/rango-exchange/rango-client/commit/017570f6d757acdf03a81ad6999e6c8c1ba03b6b))
98
+
99
+
100
+
101
+ # [0.5.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.4.1...provider-trezor@0.5.0) (2024-10-12)
102
+
103
+
104
+ ### Bug Fixes
105
+
106
+ * bump sdk and fix type issues ([d442208](https://github.com/rango-exchange/rango-client/commit/d4422083bf5dd27d5f509ce1db7f9560d05428c8))
107
+
108
+
109
+ ### Performance Improvements
110
+
111
+ * enable code splitting in build process ([fe5a41e](https://github.com/rango-exchange/rango-client/commit/fe5a41e0e297298de11cd74ca5825544742aa03a))
112
+ * lazy load signer packages ([7b88f18](https://github.com/rango-exchange/rango-client/commit/7b88f1834f7b29b4b81ab6c81a07bb88e8ccf55c))
113
+
114
+
115
+
116
+ ## [0.4.1](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.4.0...provider-trezor@0.4.1) (2024-09-16)
117
+
118
+
119
+ ### Bug Fixes
120
+
121
+ * enabling trezor by removing bundling for @trezor/connect-web ([eb0be81](https://github.com/rango-exchange/rango-client/commit/eb0be81dd582a21e4c46b32c68bfd3ddd2a3cfa0))
122
+
123
+
124
+
125
+ # [0.4.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.3.0...provider-trezor@0.4.0) (2024-09-10)
126
+
127
+
128
+ ### Bug Fixes
129
+
130
+ * incorrect error message on Trezor wallet transaction rejection ([3998563](https://github.com/rango-exchange/rango-client/commit/3998563fa06c694b34a61730b4f6c13f3323a407))
131
+
132
+
133
+
134
+ # [0.3.0](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.2.1...provider-trezor@0.3.0) (2024-08-11)
135
+
136
+
137
+ ### Features
138
+
139
+ * add derivation path modal for trezor wallet ([364422f](https://github.com/rango-exchange/rango-client/commit/364422f099b202a27a529591c5e3628bbb35508d))
140
+
141
+
142
+
143
+ ## [0.2.1](https://github.com/rango-exchange/rango-client/compare/provider-trezor@0.2.0...provider-trezor@0.2.1) (2024-07-14)
144
+
145
+
146
+
147
+ # 0.2.0 (2024-07-09)
148
+
149
+
150
+ ### Bug Fixes
151
+
152
+ * import Trezor module ([cd71eb5](https://github.com/rango-exchange/rango-client/commit/cd71eb5f390f1b07974ea9e2368f35db383a8c82))
153
+
154
+
155
+ ### Features
156
+
157
+ * add support for Trezor hardware wallet ([6edecbb](https://github.com/rango-exchange/rango-client/commit/6edecbb14fd008fc741c892bfa3e025c10160b9b))
158
+
159
+
160
+
@@ -0,0 +1,2 @@
1
+ var s=Object.defineProperty;var e=(t,r)=>s(t,"name",{value:r,configurable:!0});var o="";function g(t){o=t}e(g,"setDerivationPath");function i(){return o}e(i,"getDerivationPath");import{dynamicImportWithRefinedError as c,ETHEREUM_CHAIN_ID as a,Networks as u}from"@rango-dev/wallets-shared";var h={Failure_ActionCancelled:"User rejected the transaction."};async function d(){let t=await c(async()=>await import("@trezor/connect-web"));return t.default.default?t.default.default:t.default}e(d,"getTrezorModule");function x(){let t=new Map;return t.set(u.ETHEREUM,{chainId:a}),t}e(x,"getTrezorInstance");async function I(){let t=await d(),r=i(),n=await t.ethereumGetAddress({path:r});if(!n.success)throw new Error(n.payload.error);return{accounts:[n.payload.address],chainId:a,derivationPath:r}}e(I,"getEthereumAccounts");var w=e(t=>{let r=BigInt(0);return BigInt(t)>r?`0x${BigInt(t).toString(16)}`:"0x0"},"valueToHex"),T=e(t=>t&&!t.startsWith("m/")?"m/"+t:t,"getTrezorNormalizedDerivationPath");export{e as a,g as b,i as c,h as d,d as e,x as f,I as g,w as h,T as i};
2
+ //# sourceMappingURL=chunk-EWAGIH74.js.map
@@ -0,0 +1,7 @@
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 { TrezorConnect } from '@trezor/connect-web';\n\nimport {\n dynamicImportWithRefinedError,\n ETHEREUM_CHAIN_ID,\n Networks,\n type ProviderConnectResult,\n} from '@rango-dev/wallets-shared';\n\nimport { getDerivationPath } from './state.js';\n\nexport const trezorErrorMessages: { [statusCode: string]: string } = {\n Failure_ActionCancelled: 'User rejected the transaction.',\n};\n\n// `@trezor/connect-web` is commonjs, when we are importing it dynamically, it has some differences in different tooling. for example vite (you can check widget-examples), goes throw error. this is a workaround for solving this interop issue.\nexport async function getTrezorModule() {\n const mod = await dynamicImportWithRefinedError(\n async () => await import('@trezor/connect-web')\n );\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (mod.default.default) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return mod.default.default as unknown as TrezorConnect;\n }\n\n return mod.default;\n}\n\nexport function getTrezorInstance() {\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\n return instances;\n}\n\nexport async function getEthereumAccounts(): Promise<ProviderConnectResult> {\n const TrezorConnect = await getTrezorModule();\n const derivationPath = getDerivationPath();\n const result = await TrezorConnect.ethereumGetAddress({\n path: derivationPath,\n });\n\n if (!result.success) {\n throw new Error(result.payload.error);\n }\n\n return {\n accounts: [result.payload.address],\n chainId: ETHEREUM_CHAIN_ID,\n derivationPath,\n };\n}\n\n/*\n * Using BigInt in the valueToHex function ensures that the function\n * can handle very large integer values that exceed the range of standard JavaScript number types.\n */\nexport const valueToHex = (value: string) => {\n const ZERO_BIGINT = BigInt(0);\n const HEX_BASE = 16;\n return BigInt(value) > ZERO_BIGINT\n ? `0x${BigInt(value).toString(HEX_BASE)}`\n : '0x0';\n};\n\nexport const getTrezorNormalizedDerivationPath = (\n path: string // TrezorConnect needs master node to be added to derivation path\n) => (path && !path.startsWith('m/') ? 'm/' + path : path);\n"],
5
+ "mappings": "+EACA,IAAIA,EAAiB,GAEd,SAASC,EAAkBC,EAAc,CAC9CF,EAAiBE,CACnB,CAFgBC,EAAAF,EAAA,qBAIT,SAASG,GAAoB,CAClC,OAAOJ,CACT,CAFgBG,EAAAC,EAAA,qBCLhB,OACE,iCAAAC,EACA,qBAAAC,EACA,YAAAC,MAEK,4BAIA,IAAMC,EAAwD,CACnE,wBAAyB,gCAC3B,EAGA,eAAsBC,GAAkB,CACtC,IAAMC,EAAM,MAAMC,EAChB,SAAY,KAAM,QAAO,qBAAqB,CAChD,EAGA,OAAID,EAAI,QAAQ,QAGPA,EAAI,QAAQ,QAGdA,EAAI,OACb,CAbsBE,EAAAH,EAAA,mBAef,SAASI,GAAoB,CAKlC,IAAMC,EAAY,IAAI,IAEtB,OAAAA,EAAU,IAAIC,EAAS,SAAU,CAAE,QAASC,CAAkB,CAAC,EAExDF,CACT,CAVgBF,EAAAC,EAAA,qBAYhB,eAAsBI,GAAsD,CAC1E,IAAMC,EAAgB,MAAMT,EAAgB,EACtCU,EAAiBC,EAAkB,EACnCC,EAAS,MAAMH,EAAc,mBAAmB,CACpD,KAAMC,CACR,CAAC,EAED,GAAI,CAACE,EAAO,QACV,MAAM,IAAI,MAAMA,EAAO,QAAQ,KAAK,EAGtC,MAAO,CACL,SAAU,CAACA,EAAO,QAAQ,OAAO,EACjC,QAASL,EACT,eAAAG,CACF,CACF,CAhBsBP,EAAAK,EAAA,uBAsBf,IAAMK,EAAaV,EAACW,GAAkB,CAC3C,IAAMC,EAAc,OAAO,CAAC,EAE5B,OAAO,OAAOD,CAAK,EAAIC,EACnB,KAAK,OAAOD,CAAK,EAAE,SAFN,EAEuB,CAAC,GACrC,KACN,EAN0B,cAQbE,EAAoCb,EAC/Cc,GACIA,GAAQ,CAACA,EAAK,WAAW,IAAI,EAAI,KAAOA,EAAOA,EAFJ",
6
+ "names": ["derivationPath", "setDerivationPath", "path", "__name", "getDerivationPath", "dynamicImportWithRefinedError", "ETHEREUM_CHAIN_ID", "Networks", "trezorErrorMessages", "getTrezorModule", "mod", "dynamicImportWithRefinedError", "__name", "getTrezorInstance", "instances", "Networks", "ETHEREUM_CHAIN_ID", "getEthereumAccounts", "TrezorConnect", "derivationPath", "getDerivationPath", "result", "valueToHex", "value", "ZERO_BIGINT", "getTrezorNormalizedDerivationPath", "path"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as p,c as u,d as P,e as h,h as e}from"./chunk-EWAGIH74.js";import{cleanEvmError as G}from"@rango-dev/signer-evm";import{DEFAULT_ETHEREUM_RPC_URL as z}from"@rango-dev/wallets-shared";import{JsonRpcProvider as S,Transaction as R}from"ethers";import"rango-types";function b(s){return s?.shortMessage?new Error(s.shortMessage,{cause:s}):G(s)}p(b,"getTrezorErrorMessage");var E=class{static{p(this,"EthereumSigner")}async signMessage(r){let o=await h(),{success:n,payload:t}=await o.ethereumSignMessage({message:r,path:u()});if(!n)throw new Error(t.error);return t.signature}async signAndSendTx(r,o,n){try{let t=await h(),{gasPrice:d,maxFeePerGas:i,maxPriorityFeePerGas:c}=r,a=i&&c;if(a&&!i)throw new Error("Missing maxFeePerGas");if(a&&!c)throw new Error("Missing maxPriorityFeePerGas");if(!a&&!d)throw new Error("Missing gasPrice");let w=new S(z),T=await w.getTransactionCount(o),f=a?{maxFeePerGas:e(i||"0"),maxPriorityFeePerGas:e(c||"0")}:{gasPrice:e(d||"0")},g={to:r.to,data:r.data||"0x",value:e(r.value?.toString()||"0"),gasLimit:e(r.gasLimit?.toString()||"0"),chainId:Number.parseInt(n),nonce:e(T.toString()),...f},{success:l,payload:m}=await t.ethereumSignTransaction({path:u(),transaction:g});if(!l){let F=P[m?.code||""]||m.error;throw new Error(F)}let{r:y,s:v,v:M}=m,x=R.from({...g,nonce:Number.parseInt(g.nonce),type:a?2:0,signature:{r:y,s:v,v:parseInt(M)}}).serialized;return{hash:(await w.broadcastTransaction(x)).hash}}catch(t){throw b(t)}}};export{E as EthereumSigner,b as getTrezorErrorMessage};
2
+ //# sourceMappingURL=ethereum-ZQ7ZTGPY.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/signers/ethereum.ts"],
4
+ "sourcesContent": ["import type { EvmTransaction } from 'rango-types/mainApi';\n\nimport { cleanEvmError } from '@rango-dev/signer-evm';\nimport { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/wallets-shared';\nimport { JsonRpcProvider, Transaction } from 'ethers';\nimport { type GenericSigner } from 'rango-types';\n\nimport {\n getTrezorModule,\n trezorErrorMessages,\n valueToHex,\n} from '../helpers.js';\nimport { getDerivationPath } from '../state.js';\n\nexport function getTrezorErrorMessage(error: any) {\n if (error?.shortMessage) {\n /*\n * Some error signs have lengthy, challenging-to-read messages.\n * shortMessage is used because it is shorter and easier to understand.\n */\n return new Error(error.shortMessage, { cause: error });\n }\n return cleanEvmError(error);\n}\n\nexport class EthereumSigner implements GenericSigner<EvmTransaction> {\n async signMessage(msg: string): Promise<string> {\n const TrezorConnect = await getTrezorModule();\n\n const { success, payload } = await TrezorConnect.ethereumSignMessage({\n message: msg,\n path: getDerivationPath(),\n });\n if (!success) {\n throw new Error(payload.error);\n }\n return payload.signature;\n }\n\n async signAndSendTx(\n tx: EvmTransaction,\n fromAddress: string,\n chainId: string\n ): Promise<{ hash: string }> {\n try {\n const TrezorConnect = await getTrezorModule();\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = tx;\n const isEIP1559 = maxFeePerGas && maxPriorityFeePerGas;\n\n if (isEIP1559 && !maxFeePerGas) {\n throw new Error('Missing maxFeePerGas');\n }\n if (isEIP1559 && !maxPriorityFeePerGas) {\n throw new Error('Missing maxPriorityFeePerGas');\n }\n if (!isEIP1559 && !gasPrice) {\n throw new Error('Missing gasPrice');\n }\n const provider = new JsonRpcProvider(DEFAULT_ETHEREUM_RPC_URL); // Provider to broadcast transaction\n const transactionCount = await provider.getTransactionCount(fromAddress); // Get nonce\n const additionalFields = isEIP1559\n ? {\n maxFeePerGas: valueToHex(maxFeePerGas || '0'),\n maxPriorityFeePerGas: valueToHex(maxPriorityFeePerGas || '0'),\n }\n : {\n gasPrice: valueToHex(gasPrice || '0'),\n };\n\n const transaction = {\n to: tx.to,\n data: tx.data || '0x',\n value: valueToHex(tx.value?.toString() || '0'),\n gasLimit: valueToHex(tx.gasLimit?.toString() || '0'),\n chainId: Number.parseInt(chainId),\n nonce: valueToHex(transactionCount.toString()),\n ...additionalFields,\n };\n\n const { success, payload } = await TrezorConnect.ethereumSignTransaction({\n path: getDerivationPath(),\n transaction,\n });\n\n if (!success) {\n const errorMessage =\n trezorErrorMessages[payload?.code || ''] || payload.error;\n throw new Error(errorMessage);\n }\n const { r, s, v } = payload;\n\n const serializedTx = Transaction.from({\n ...transaction,\n nonce: Number.parseInt(transaction.nonce),\n /*\n * Type 0: This refers to the legacy transaction type that has been used since Ethereum's inception.\n * Type 2: This refers to the new transaction type introduced with the EIP-1559 (Ethereum Improvement Proposal 1559) update,\n * which was part of the London hard fork.\n */\n type: isEIP1559 ? 2 : 0,\n signature: { r, s, v: parseInt(v) },\n }).serialized;\n const broadcastResult = await provider.broadcastTransaction(serializedTx);\n\n return { hash: broadcastResult.hash };\n } catch (error) {\n throw getTrezorErrorMessage(error);\n }\n }\n}\n"],
5
+ "mappings": "oEAEA,OAAS,iBAAAA,MAAqB,wBAC9B,OAAS,4BAAAC,MAAgC,4BACzC,OAAS,mBAAAC,EAAiB,eAAAC,MAAmB,SAC7C,MAAmC,cAS5B,SAASC,EAAsBC,EAAY,CAChD,OAAIA,GAAO,aAKF,IAAI,MAAMA,EAAM,aAAc,CAAE,MAAOA,CAAM,CAAC,EAEhDC,EAAcD,CAAK,CAC5B,CATgBE,EAAAH,EAAA,yBAWT,IAAMI,EAAN,KAA8D,CAzBrE,MAyBqE,CAAAD,EAAA,uBACnE,MAAM,YAAYE,EAA8B,CAC9C,IAAMC,EAAgB,MAAMC,EAAgB,EAEtC,CAAE,QAAAC,EAAS,QAAAC,CAAQ,EAAI,MAAMH,EAAc,oBAAoB,CACnE,QAASD,EACT,KAAMK,EAAkB,CAC1B,CAAC,EACD,GAAI,CAACF,EACH,MAAM,IAAI,MAAMC,EAAQ,KAAK,EAE/B,OAAOA,EAAQ,SACjB,CAEA,MAAM,cACJE,EACAC,EACAC,EAC2B,CAC3B,GAAI,CACF,IAAMP,EAAgB,MAAMC,EAAgB,EACtC,CAAE,SAAAO,EAAU,aAAAC,EAAc,qBAAAC,CAAqB,EAAIL,EACnDM,EAAYF,GAAgBC,EAElC,GAAIC,GAAa,CAACF,EAChB,MAAM,IAAI,MAAM,sBAAsB,EAExC,GAAIE,GAAa,CAACD,EAChB,MAAM,IAAI,MAAM,8BAA8B,EAEhD,GAAI,CAACC,GAAa,CAACH,EACjB,MAAM,IAAI,MAAM,kBAAkB,EAEpC,IAAMI,EAAW,IAAIC,EAAgBC,CAAwB,EACvDC,EAAmB,MAAMH,EAAS,oBAAoBN,CAAW,EACjEU,EAAmBL,EACrB,CACE,aAAcM,EAAWR,GAAgB,GAAG,EAC5C,qBAAsBQ,EAAWP,GAAwB,GAAG,CAC9D,EACA,CACE,SAAUO,EAAWT,GAAY,GAAG,CACtC,EAEEU,EAAc,CAClB,GAAIb,EAAG,GACP,KAAMA,EAAG,MAAQ,KACjB,MAAOY,EAAWZ,EAAG,OAAO,SAAS,GAAK,GAAG,EAC7C,SAAUY,EAAWZ,EAAG,UAAU,SAAS,GAAK,GAAG,EACnD,QAAS,OAAO,SAASE,CAAO,EAChC,MAAOU,EAAWF,EAAiB,SAAS,CAAC,EAC7C,GAAGC,CACL,EAEM,CAAE,QAAAd,EAAS,QAAAC,CAAQ,EAAI,MAAMH,EAAc,wBAAwB,CACvE,KAAMI,EAAkB,EACxB,YAAAc,CACF,CAAC,EAED,GAAI,CAAChB,EAAS,CACZ,IAAMiB,EACJC,EAAoBjB,GAAS,MAAQ,EAAE,GAAKA,EAAQ,MACtD,MAAM,IAAI,MAAMgB,CAAY,CAC9B,CACA,GAAM,CAAE,EAAAE,EAAG,EAAAC,EAAG,EAAAC,CAAE,EAAIpB,EAEdqB,EAAeC,EAAY,KAAK,CACpC,GAAGP,EACH,MAAO,OAAO,SAASA,EAAY,KAAK,EAMxC,KAAMP,EAAY,EAAI,EACtB,UAAW,CAAE,EAAAU,EAAG,EAAAC,EAAG,EAAG,SAASC,CAAC,CAAE,CACpC,CAAC,EAAE,WAGH,MAAO,CAAE,MAFe,MAAMX,EAAS,qBAAqBY,CAAY,GAEzC,IAAK,CACtC,OAAS7B,EAAO,CACd,MAAMD,EAAsBC,CAAK,CACnC,CACF,CACF",
6
+ "names": ["cleanEvmError", "DEFAULT_ETHEREUM_RPC_URL", "JsonRpcProvider", "Transaction", "getTrezorErrorMessage", "error", "cleanEvmError", "__name", "EthereumSigner", "msg", "TrezorConnect", "getTrezorModule", "success", "payload", "getDerivationPath", "tx", "fromAddress", "chainId", "gasPrice", "maxFeePerGas", "maxPriorityFeePerGas", "isEIP1559", "provider", "JsonRpcProvider", "DEFAULT_ETHEREUM_RPC_URL", "transactionCount", "additionalFields", "valueToHex", "transaction", "errorMessage", "trezorErrorMessages", "r", "s", "v", "serializedTx", "Transaction"]
7
+ }
@@ -0,0 +1,16 @@
1
+ import type { TrezorConnect } from '@trezor/connect-web';
2
+ import { type ProviderConnectResult } from '@rango-dev/wallets-shared';
3
+ export declare const trezorErrorMessages: {
4
+ [statusCode: string]: string;
5
+ };
6
+ export declare function getTrezorModule(): Promise<TrezorConnect | (Omit<TrezorConnect, "init"> & {
7
+ init: import("@trezor/connect/lib/types/api/init.js").InitType<import("@trezor/connect").ConnectSettingsWeb>;
8
+ } & {
9
+ renderWebUSBButton: (className?: string) => void;
10
+ disableWebUSB: () => void;
11
+ requestWebUSBDevice: () => void;
12
+ })>;
13
+ export declare function getTrezorInstance(): Map<any, any>;
14
+ export declare function getEthereumAccounts(): Promise<ProviderConnectResult>;
15
+ export declare const valueToHex: (value: string) => string;
16
+ export declare const getTrezorNormalizedDerivationPath: (path: string) => string;
@@ -0,0 +1,15 @@
1
+ import type { Environments } from './types.js';
2
+ import type { Connect, WalletInfo } from '@rango-dev/wallets-shared';
3
+ import { WalletTypes } from '@rango-dev/wallets-shared';
4
+ import { type BlockchainMeta, type SignerFactory } from 'rango-types';
5
+ import { getTrezorInstance } from './helpers.js';
6
+ export declare const config: {
7
+ type: WalletTypes;
8
+ };
9
+ export type { Environments };
10
+ type Provider = any;
11
+ export declare const init: (environments: Environments) => void;
12
+ export declare const getInstance: typeof getTrezorInstance;
13
+ export declare const connect: Connect;
14
+ export declare const getSigners: (provider: Provider) => Promise<SignerFactory>;
15
+ export declare const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo;
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{a as r,b as s,e as c,f as m,g as l,i as p}from"./chunk-EWAGIH74.js";import{Networks as g,WalletTypes as v}from"@rango-dev/wallets-shared";import"rango-types";import{dynamicImportWithRefinedError as f}from"@rango-dev/wallets-shared";import{DefaultSignerFactory as y,TransactionType as u}from"rango-types";async function i(){let t=new y,{EthereumSigner:n}=await f(async()=>await import("./ethereum-ZQ7ZTGPY.js"));return t.registerSigner(u.EVM,new n),t}r(i,"getSigners");var h={appUrl:"",email:""},k={type:v.TREZOR},D=r(t=>{h=t.manifest},"init"),C=m,d=!1,I=r(async({namespaces:t})=>{let n=[],o=await c(),e=t?.find(a=>a.namespace==="EVM");if(e)if(e.derivationPath){s(p(e.derivationPath)),d||(await o.init({lazyLoad:!0,manifest:h}),d=!0);let a=await l();n.push(a)}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(a=>a.namespace)}`);return n},"connect"),L=i,R=r(t=>{let n=[],o=t.find(e=>e.name===g.ETHEREUM);return o&&n.push(o),{name:"Trezor",img:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/trezor/icon.svg",installLink:{DEFAULT:"https://trezor.io/learn/a/download-verify-trezor-suite"},color:"black",supportedChains:n,showOnMobile:!1,needsNamespace:{selection:"single",data:[{id:"ETH",value:"EVM",label:"Ethereum",getSupportedChains:e=>e.filter(a=>a.name===g.ETHEREUM)}]},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}`}]}}},"getWalletInfo");export{k as config,I as connect,C as getInstance,L as getSigners,R as getWalletInfo,D as init};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/signer.ts"],
4
+ "sourcesContent": ["import type { Environments } from './types.js';\nimport type {\n Connect,\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 getTrezorInstance,\n getTrezorModule,\n getTrezorNormalizedDerivationPath,\n} from './helpers.js';\nimport signer from './signer.js';\nimport { setDerivationPath } from './state.js';\n\nlet trezorManifest: Environments['manifest'] = {\n appUrl: '',\n email: '',\n};\nexport const config = {\n type: WalletTypes.TREZOR,\n};\n\nexport type { Environments };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Provider = any;\n\nexport const init = (environments: Environments) => {\n trezorManifest = environments.manifest;\n};\n\nexport const getInstance = getTrezorInstance;\n\nlet isTrezorInitialized = false;\nexport const connect: Connect = async ({ namespaces }) => {\n const results: ProviderConnectResult[] = [];\n\n const TrezorConnect = await getTrezorModule();\n\n const evmNamespace = namespaces?.find(\n (namespaceItem) => namespaceItem.namespace === 'EVM'\n );\n\n if (evmNamespace) {\n if (evmNamespace.derivationPath) {\n setDerivationPath(\n getTrezorNormalizedDerivationPath(evmNamespace.derivationPath)\n );\n\n if (!isTrezorInitialized) {\n await TrezorConnect.init({\n lazyLoad: true, // this param will prevent iframe injection until TrezorConnect.method will be called\n manifest: trezorManifest,\n });\n\n isTrezorInitialized = true;\n }\n\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 getSigners: (provider: Provider) => 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 return {\n name: 'Trezor',\n img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/trezor/icon.svg',\n installLink: {\n DEFAULT: 'https://trezor.io/learn/a/download-verify-trezor-suite',\n },\n color: 'black',\n supportedChains,\n showOnMobile: false,\n\n needsNamespace: {\n selection: 'single',\n data: [\n {\n id: 'ETH',\n value: 'EVM',\n label: 'Ethereum',\n getSupportedChains: (allBlockchains: BlockchainMeta[]) =>\n allBlockchains.filter((chain) => chain.name === Networks.ETHEREUM),\n },\n ],\n },\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};\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 signers.registerSigner(TxType.EVM, new EthereumSigner());\n return signers;\n}\n"],
5
+ "mappings": "2EAOA,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,EACA,OAAAH,EAAQ,eAAeI,EAAO,IAAK,IAAIF,CAAgB,EAChDF,CACT,CAP8BK,EAAAN,EAAA,cDc9B,IAAIO,EAA2C,CAC7C,OAAQ,GACR,MAAO,EACT,EACaC,EAAS,CACpB,KAAMC,EAAY,MACpB,EAMaC,EAAOC,EAACC,GAA+B,CAClDL,EAAiBK,EAAa,QAChC,EAFoB,QAIPC,EAAcC,EAEvBC,EAAsB,GACbC,EAAmBL,EAAA,MAAO,CAAE,WAAAM,CAAW,IAAM,CACxD,IAAMC,EAAmC,CAAC,EAEpCC,EAAgB,MAAMC,EAAgB,EAEtCC,EAAeJ,GAAY,KAC9BK,GAAkBA,EAAc,YAAc,KACjD,EAEA,GAAID,EACF,GAAIA,EAAa,eAAgB,CAC/BE,EACEC,EAAkCH,EAAa,cAAc,CAC/D,EAEKN,IACH,MAAMI,EAAc,KAAK,CACvB,SAAU,GACV,SAAUZ,CACZ,CAAC,EAEDQ,EAAsB,IAGxB,IAAMU,EAAW,MAAMC,EAAoB,EAC3CR,EAAQ,KAAKO,CAAQ,CACvB,KACE,OAAM,IAAI,MAAM,mCAAmC,MAGrD,OAAM,IAAI,MACR,2GAA2GR,GAAY,IACpHK,GAAkBA,EAAc,SACnC,CAAC,EACH,EAGF,OAAOJ,CACT,EAtCgC,WAwCnBS,EACXA,EAEWC,EAAkEjB,EAC7EkB,GACG,CACH,IAAMC,EAAoC,CAAC,EAErCC,EAAqBF,EAAe,KACvCG,GAAUA,EAAM,OAASC,EAAS,QACrC,EACA,OAAIF,GACFD,EAAgB,KAAKC,CAAkB,EAGlC,CACL,KAAM,SACN,IAAK,uFACL,YAAa,CACX,QAAS,wDACX,EACA,MAAO,QACP,gBAAAD,EACA,aAAc,GAEd,eAAgB,CACd,UAAW,SACX,KAAM,CACJ,CACE,GAAI,MACJ,MAAO,MACP,MAAO,WACP,mBAAqBI,GACnBA,EAAe,OAAQF,GAAUA,EAAM,OAASC,EAAS,QAAQ,CACrE,CACF,CACF,EACA,oBAAqB,CACnB,KAAM,CACJ,CACE,GAAI,WACJ,MAAO,kCACP,UAAW,MACX,uBAAyBE,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,CACF,CACF,EArE+E",
6
+ "names": ["Networks", "WalletTypes", "dynamicImportWithRefinedError", "DefaultSignerFactory", "TxType", "getSigners", "signers", "DefaultSignerFactory", "EthereumSigner", "dynamicImportWithRefinedError", "TxType", "__name", "trezorManifest", "config", "WalletTypes", "init", "__name", "environments", "getInstance", "getTrezorInstance", "isTrezorInitialized", "connect", "namespaces", "results", "TrezorConnect", "getTrezorModule", "evmNamespace", "namespaceItem", "setDerivationPath", "getTrezorNormalizedDerivationPath", "accounts", "getEthereumAccounts", "getSigners", "getWalletInfo", "allBlockChains", "supportedChains", "ethereumBlockchain", "chain", "Networks", "allBlockchains", "index"]
7
+ }
@@ -0,0 +1 @@
1
+ {"inputs":{"src/state.ts":{"bytes":290,"imports":[{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/helpers.ts":{"bytes":2433,"imports":[{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"src/state.ts","kind":"import-statement","original":"./state.js"},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/signers/ethereum.ts":{"bytes":3696,"imports":[{"path":"@rango-dev/signer-evm","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"ethers","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/helpers.ts","kind":"import-statement","original":"../helpers.js"},{"path":"src/state.ts","kind":"import-statement","original":"../state.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/signer.ts":{"bytes":526,"imports":[{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/signers/ethereum.ts","kind":"dynamic-import","original":"./signers/ethereum.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":4182,"imports":[{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/helpers.ts","kind":"import-statement","original":"./helpers.js"},{"path":"src/signer.ts","kind":"import-statement","original":"./signer.js"},{"path":"src/state.ts","kind":"import-statement","original":"./state.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":7387},"dist/index.js":{"imports":[{"path":"dist/chunk-EWAGIH74.js","kind":"import-statement"},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"dist/ethereum-ZQ7ZTGPY.js","kind":"dynamic-import"}],"exports":["config","connect","getInstance","getSigners","getWalletInfo","init"],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":1697},"src/signer.ts":{"bytesInOutput":310}},"bytes":2212},"dist/ethereum-ZQ7ZTGPY.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":6222},"dist/ethereum-ZQ7ZTGPY.js":{"imports":[{"path":"dist/chunk-EWAGIH74.js","kind":"import-statement"},{"path":"@rango-dev/signer-evm","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"ethers","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true}],"exports":["EthereumSigner","getTrezorErrorMessage"],"entryPoint":"src/signers/ethereum.ts","inputs":{"src/signers/ethereum.ts":{"bytesInOutput":1391}},"bytes":1561},"dist/chunk-EWAGIH74.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":4399},"dist/chunk-EWAGIH74.js":{"imports":[{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true}],"exports":["a","b","c","d","e","f","g","h","i"],"inputs":{"src/state.ts":{"bytesInOutput":99},"src/helpers.ts":{"bytesInOutput":814}},"bytes":1107}}}
@@ -0,0 +1,2 @@
1
+ import type { SignerFactory } from 'rango-types';
2
+ export default function getSigners(): Promise<SignerFactory>;
@@ -0,0 +1,9 @@
1
+ import type { EvmTransaction } from 'rango-types/mainApi';
2
+ import { type GenericSigner } from 'rango-types';
3
+ export declare function getTrezorErrorMessage(error: any): Error;
4
+ export declare class EthereumSigner implements GenericSigner<EvmTransaction> {
5
+ signMessage(msg: string): Promise<string>;
6
+ signAndSendTx(tx: EvmTransaction, fromAddress: string, chainId: string): Promise<{
7
+ hash: string;
8
+ }>;
9
+ }
@@ -0,0 +1,2 @@
1
+ export declare function setDerivationPath(path: string): void;
2
+ export declare function getDerivationPath(): string;
@@ -0,0 +1,6 @@
1
+ export interface Environments {
2
+ manifest: {
3
+ appUrl: string;
4
+ email: string;
5
+ };
6
+ }
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@rango-dev/provider-trezor",
3
+ "version": "0.0.0-experimental-936229e8-20251208",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "source": "./src/index.ts",
7
+ "main": "./dist/index.js",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "typings": "dist/index.d.ts",
15
+ "files": [
16
+ "dist",
17
+ "src"
18
+ ],
19
+ "scripts": {
20
+ "build": "node ../../scripts/build/command.mjs --path wallets/provider-trezor --splitting",
21
+ "ts-check": "tsc --declaration --emitDeclarationOnly -p ./tsconfig.json",
22
+ "clean": "rimraf dist",
23
+ "format": "prettier --write '{.,src}/**/*.{ts,tsx}'",
24
+ "lint": "eslint \"**/*.{ts,tsx}\""
25
+ },
26
+ "dependencies": {
27
+ "@rango-dev/signer-evm": "^0.40.0",
28
+ "@rango-dev/wallets-shared": "^0.0.0-experimental-936229e8-20251208",
29
+ "@trezor/connect-web": "^9.5.0",
30
+ "ethers": "^6.13.2",
31
+ "rango-types": "^0.1.89"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ }
36
+ }
package/readme.md ADDED
@@ -0,0 +1 @@
1
+ # @rango-dev/provider-trezor
package/src/helpers.ts ADDED
@@ -0,0 +1,76 @@
1
+ import type { TrezorConnect } from '@trezor/connect-web';
2
+
3
+ import {
4
+ dynamicImportWithRefinedError,
5
+ ETHEREUM_CHAIN_ID,
6
+ Networks,
7
+ type ProviderConnectResult,
8
+ } from '@rango-dev/wallets-shared';
9
+
10
+ import { getDerivationPath } from './state.js';
11
+
12
+ export const trezorErrorMessages: { [statusCode: string]: string } = {
13
+ Failure_ActionCancelled: 'User rejected the transaction.',
14
+ };
15
+
16
+ // `@trezor/connect-web` is commonjs, when we are importing it dynamically, it has some differences in different tooling. for example vite (you can check widget-examples), goes throw error. this is a workaround for solving this interop issue.
17
+ export async function getTrezorModule() {
18
+ const mod = await dynamicImportWithRefinedError(
19
+ async () => await import('@trezor/connect-web')
20
+ );
21
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
22
+ // @ts-ignore
23
+ if (mod.default.default) {
24
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
25
+ // @ts-ignore
26
+ return mod.default.default as unknown as TrezorConnect;
27
+ }
28
+
29
+ return mod.default;
30
+ }
31
+
32
+ export function getTrezorInstance() {
33
+ /*
34
+ * Instances have a required property which is `chainId` and is using in swap execution.
35
+ * Here we are setting it as Ethereum always since we are supporting only eth for now.
36
+ */
37
+ const instances = new Map();
38
+
39
+ instances.set(Networks.ETHEREUM, { chainId: ETHEREUM_CHAIN_ID });
40
+
41
+ return instances;
42
+ }
43
+
44
+ export async function getEthereumAccounts(): Promise<ProviderConnectResult> {
45
+ const TrezorConnect = await getTrezorModule();
46
+ const derivationPath = getDerivationPath();
47
+ const result = await TrezorConnect.ethereumGetAddress({
48
+ path: derivationPath,
49
+ });
50
+
51
+ if (!result.success) {
52
+ throw new Error(result.payload.error);
53
+ }
54
+
55
+ return {
56
+ accounts: [result.payload.address],
57
+ chainId: ETHEREUM_CHAIN_ID,
58
+ derivationPath,
59
+ };
60
+ }
61
+
62
+ /*
63
+ * Using BigInt in the valueToHex function ensures that the function
64
+ * can handle very large integer values that exceed the range of standard JavaScript number types.
65
+ */
66
+ export const valueToHex = (value: string) => {
67
+ const ZERO_BIGINT = BigInt(0);
68
+ const HEX_BASE = 16;
69
+ return BigInt(value) > ZERO_BIGINT
70
+ ? `0x${BigInt(value).toString(HEX_BASE)}`
71
+ : '0x0';
72
+ };
73
+
74
+ export const getTrezorNormalizedDerivationPath = (
75
+ path: string // TrezorConnect needs master node to be added to derivation path
76
+ ) => (path && !path.startsWith('m/') ? 'm/' + path : path);
package/src/index.ts ADDED
@@ -0,0 +1,151 @@
1
+ import type { Environments } from './types.js';
2
+ import type {
3
+ Connect,
4
+ ProviderConnectResult,
5
+ WalletInfo,
6
+ } from '@rango-dev/wallets-shared';
7
+
8
+ import { Networks, WalletTypes } from '@rango-dev/wallets-shared';
9
+ import { type BlockchainMeta, type SignerFactory } from 'rango-types';
10
+
11
+ import {
12
+ getEthereumAccounts,
13
+ getTrezorInstance,
14
+ getTrezorModule,
15
+ getTrezorNormalizedDerivationPath,
16
+ } from './helpers.js';
17
+ import signer from './signer.js';
18
+ import { setDerivationPath } from './state.js';
19
+
20
+ let trezorManifest: Environments['manifest'] = {
21
+ appUrl: '',
22
+ email: '',
23
+ };
24
+ export const config = {
25
+ type: WalletTypes.TREZOR,
26
+ };
27
+
28
+ export type { Environments };
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ type Provider = any;
31
+
32
+ export const init = (environments: Environments) => {
33
+ trezorManifest = environments.manifest;
34
+ };
35
+
36
+ export const getInstance = getTrezorInstance;
37
+
38
+ let isTrezorInitialized = false;
39
+ export const connect: Connect = async ({ namespaces }) => {
40
+ const results: ProviderConnectResult[] = [];
41
+
42
+ const TrezorConnect = await getTrezorModule();
43
+
44
+ const evmNamespace = namespaces?.find(
45
+ (namespaceItem) => namespaceItem.namespace === 'EVM'
46
+ );
47
+
48
+ if (evmNamespace) {
49
+ if (evmNamespace.derivationPath) {
50
+ setDerivationPath(
51
+ getTrezorNormalizedDerivationPath(evmNamespace.derivationPath)
52
+ );
53
+
54
+ if (!isTrezorInitialized) {
55
+ await TrezorConnect.init({
56
+ lazyLoad: true, // this param will prevent iframe injection until TrezorConnect.method will be called
57
+ manifest: trezorManifest,
58
+ });
59
+
60
+ isTrezorInitialized = true;
61
+ }
62
+
63
+ const accounts = await getEthereumAccounts();
64
+ results.push(accounts);
65
+ } else {
66
+ throw new Error('Derivation Path can not be empty.');
67
+ }
68
+ } else {
69
+ throw new Error(
70
+ `It appears that you have selected a namespace that is not yet supported by our system. Your namespaces: ${namespaces?.map(
71
+ (namespaceItem) => namespaceItem.namespace
72
+ )}`
73
+ );
74
+ }
75
+
76
+ return results;
77
+ };
78
+
79
+ export const getSigners: (provider: Provider) => Promise<SignerFactory> =
80
+ signer;
81
+
82
+ export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
83
+ allBlockChains
84
+ ) => {
85
+ const supportedChains: BlockchainMeta[] = [];
86
+
87
+ const ethereumBlockchain = allBlockChains.find(
88
+ (chain) => chain.name === Networks.ETHEREUM
89
+ );
90
+ if (ethereumBlockchain) {
91
+ supportedChains.push(ethereumBlockchain);
92
+ }
93
+
94
+ return {
95
+ name: 'Trezor',
96
+ img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/trezor/icon.svg',
97
+ installLink: {
98
+ DEFAULT: 'https://trezor.io/learn/a/download-verify-trezor-suite',
99
+ },
100
+ color: 'black',
101
+ supportedChains,
102
+ showOnMobile: false,
103
+
104
+ needsNamespace: {
105
+ selection: 'single',
106
+ data: [
107
+ {
108
+ id: 'ETH',
109
+ value: 'EVM',
110
+ label: 'Ethereum',
111
+ getSupportedChains: (allBlockchains: BlockchainMeta[]) =>
112
+ allBlockchains.filter((chain) => chain.name === Networks.ETHEREUM),
113
+ },
114
+ ],
115
+ },
116
+ needsDerivationPath: {
117
+ data: [
118
+ {
119
+ id: 'metamask',
120
+ label: `Metamask (m/44'/60'/0'/0/index)`,
121
+ namespace: 'EVM',
122
+ generateDerivationPath: (index: string) => `44'/60'/0'/0/${index}`,
123
+ },
124
+ {
125
+ id: 'ledgerLive',
126
+ label: `LedgerLive (m/44'/60'/index'/0/0)`,
127
+ namespace: 'EVM',
128
+ generateDerivationPath: (index: string) => `44'/60'/${index}'/0/0`,
129
+ },
130
+ {
131
+ id: 'legacy',
132
+ label: `Legacy (m/44'/60'/0'/index)`,
133
+ namespace: 'EVM',
134
+ generateDerivationPath: (index: string) => `44'/60'/0'/${index}`,
135
+ },
136
+ {
137
+ id: `(m/44'/501'/index')`,
138
+ label: `(m/44'/501'/index')`,
139
+ namespace: 'Solana',
140
+ generateDerivationPath: (index: string) => `44'/501'/${index}'`,
141
+ },
142
+ {
143
+ id: `(m/44'/501'/0'/index)`,
144
+ label: `(m/44'/501'/0'/index)`,
145
+ namespace: 'Solana',
146
+ generateDerivationPath: (index: string) => `44'/501'/0'/${index}`,
147
+ },
148
+ ],
149
+ },
150
+ };
151
+ };
package/src/signer.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { SignerFactory } from 'rango-types';
2
+
3
+ import { dynamicImportWithRefinedError } from '@rango-dev/wallets-shared';
4
+ import { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';
5
+
6
+ export default async function getSigners(): Promise<SignerFactory> {
7
+ const signers = new DefaultSignerFactory();
8
+ const { EthereumSigner } = await dynamicImportWithRefinedError(
9
+ async () => await import('./signers/ethereum.js')
10
+ );
11
+ signers.registerSigner(TxType.EVM, new EthereumSigner());
12
+ return signers;
13
+ }
@@ -0,0 +1,110 @@
1
+ import type { EvmTransaction } from 'rango-types/mainApi';
2
+
3
+ import { cleanEvmError } from '@rango-dev/signer-evm';
4
+ import { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/wallets-shared';
5
+ import { JsonRpcProvider, Transaction } from 'ethers';
6
+ import { type GenericSigner } from 'rango-types';
7
+
8
+ import {
9
+ getTrezorModule,
10
+ trezorErrorMessages,
11
+ valueToHex,
12
+ } from '../helpers.js';
13
+ import { getDerivationPath } from '../state.js';
14
+
15
+ export function getTrezorErrorMessage(error: any) {
16
+ if (error?.shortMessage) {
17
+ /*
18
+ * Some error signs have lengthy, challenging-to-read messages.
19
+ * shortMessage is used because it is shorter and easier to understand.
20
+ */
21
+ return new Error(error.shortMessage, { cause: error });
22
+ }
23
+ return cleanEvmError(error);
24
+ }
25
+
26
+ export class EthereumSigner implements GenericSigner<EvmTransaction> {
27
+ async signMessage(msg: string): Promise<string> {
28
+ const TrezorConnect = await getTrezorModule();
29
+
30
+ const { success, payload } = await TrezorConnect.ethereumSignMessage({
31
+ message: msg,
32
+ path: getDerivationPath(),
33
+ });
34
+ if (!success) {
35
+ throw new Error(payload.error);
36
+ }
37
+ return payload.signature;
38
+ }
39
+
40
+ async signAndSendTx(
41
+ tx: EvmTransaction,
42
+ fromAddress: string,
43
+ chainId: string
44
+ ): Promise<{ hash: string }> {
45
+ try {
46
+ const TrezorConnect = await getTrezorModule();
47
+ const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = tx;
48
+ const isEIP1559 = maxFeePerGas && maxPriorityFeePerGas;
49
+
50
+ if (isEIP1559 && !maxFeePerGas) {
51
+ throw new Error('Missing maxFeePerGas');
52
+ }
53
+ if (isEIP1559 && !maxPriorityFeePerGas) {
54
+ throw new Error('Missing maxPriorityFeePerGas');
55
+ }
56
+ if (!isEIP1559 && !gasPrice) {
57
+ throw new Error('Missing gasPrice');
58
+ }
59
+ const provider = new JsonRpcProvider(DEFAULT_ETHEREUM_RPC_URL); // Provider to broadcast transaction
60
+ const transactionCount = await provider.getTransactionCount(fromAddress); // Get nonce
61
+ const additionalFields = isEIP1559
62
+ ? {
63
+ maxFeePerGas: valueToHex(maxFeePerGas || '0'),
64
+ maxPriorityFeePerGas: valueToHex(maxPriorityFeePerGas || '0'),
65
+ }
66
+ : {
67
+ gasPrice: valueToHex(gasPrice || '0'),
68
+ };
69
+
70
+ const transaction = {
71
+ to: tx.to,
72
+ data: tx.data || '0x',
73
+ value: valueToHex(tx.value?.toString() || '0'),
74
+ gasLimit: valueToHex(tx.gasLimit?.toString() || '0'),
75
+ chainId: Number.parseInt(chainId),
76
+ nonce: valueToHex(transactionCount.toString()),
77
+ ...additionalFields,
78
+ };
79
+
80
+ const { success, payload } = await TrezorConnect.ethereumSignTransaction({
81
+ path: getDerivationPath(),
82
+ transaction,
83
+ });
84
+
85
+ if (!success) {
86
+ const errorMessage =
87
+ trezorErrorMessages[payload?.code || ''] || payload.error;
88
+ throw new Error(errorMessage);
89
+ }
90
+ const { r, s, v } = payload;
91
+
92
+ const serializedTx = Transaction.from({
93
+ ...transaction,
94
+ nonce: Number.parseInt(transaction.nonce),
95
+ /*
96
+ * Type 0: This refers to the legacy transaction type that has been used since Ethereum's inception.
97
+ * Type 2: This refers to the new transaction type introduced with the EIP-1559 (Ethereum Improvement Proposal 1559) update,
98
+ * which was part of the London hard fork.
99
+ */
100
+ type: isEIP1559 ? 2 : 0,
101
+ signature: { r, s, v: parseInt(v) },
102
+ }).serialized;
103
+ const broadcastResult = await provider.broadcastTransaction(serializedTx);
104
+
105
+ return { hash: broadcastResult.hash };
106
+ } catch (error) {
107
+ throw getTrezorErrorMessage(error);
108
+ }
109
+ }
110
+ }
package/src/state.ts ADDED
@@ -0,0 +1,10 @@
1
+ // We keep derivationPath here because we need to maintain it for signing transactions after it is set in connect method
2
+ let derivationPath = '';
3
+
4
+ export function setDerivationPath(path: string) {
5
+ derivationPath = path;
6
+ }
7
+
8
+ export function getDerivationPath() {
9
+ return derivationPath;
10
+ }
package/src/types.ts ADDED
@@ -0,0 +1,3 @@
1
+ export interface Environments {
2
+ manifest: { appUrl: string; email: string };
3
+ }