Trezor Wallet Інтеграція
Trezor — другий за популярністю hardware wallet після Ledger, з принципово іншою архітектурою комунікації. Якщо Ledger використовує нативний WebHID/WebUSB, Trezor працює через власний мост — Trezor Suite Bridge або WebUSB-транспорт. Це впливає на те, як будувати інтеграцію та які сценарії обробляти.
Архітектура комунікації
Trezor Connect SDK (@trezor/connect-web) працює через iframe з доменом connect.trezor.io. Це означає: ваш код не спілкується з пристроєм напрямку — запит йде в iframe, той спілкується з Trezor Suite Bridge (нативне застосунок) або через WebUSB, отримує відповідь, повертає її через postMessage.
Такий підхід дає безпеку (ключі не покидають контрольований домен Trezor) та зручність (не потрібно встановлювати додаткове ПЗ при WebUSB), але створює залежність від інфраструктури Trezor.
Для застосунків, яким потрібна повна автономність, існує @trezor/connect (без iframe) — використовується в Trezor Suite напрямку. Але для web-інтеграції @trezor/connect-web — стандартний вибір.
Базова інтеграція
Ініціалізація:
import TrezorConnect from "@trezor/connect-web";
await TrezorConnect.init({
lazyLoad: true,
manifest: {
email: "[email protected]",
appUrl: "https://yourproject.com",
},
});
Manifest обов'язковий — Trezor використовує його для ідентифікації застосунку та відображення його користувачу на екрані пристрою.
Отримання адреси:
const result = await TrezorConnect.ethereumGetAddress({
path: "m/44'/60'/0'/0/0",
showOnTrezor: true,
});
if (result.success) {
console.log(result.payload.address);
} else {
console.error(result.payload.error);
}
Підпис транзакції через TrezorConnect.ethereumSignTransaction. На відміну від Ledger, Trezor приймає не RLP, а об'єкт з полями:
const result = await TrezorConnect.ethereumSignTransaction({
path: "m/44'/60'/0'/0/0",
transaction: {
to: "0xRecipient",
value: "0xDE0B6B3A7640000", // 1 ETH у hex
data: "0x",
chainId: 1,
nonce: "0x5",
gasLimit: "0x5208",
maxFeePerGas: "0x...", // EIP-1559
maxPriorityFeePerGas: "0x...",
},
});
EIP-712 Підпис
Trezor підтримує ethereumSignTypedData починаючи з firmware 2.4.3 (Model T) та 1.10.5 (Model One). Важливий нюанс: Model One має обмежений екран та не може відображати складні структури — для нього використовується metamask_v4_compat: true режим з хешуванням на стороні хоста.
const result = await TrezorConnect.ethereumSignTypedData({
path: "m/44'/60'/0'/0/0",
data: typedData, // стандартний EIP-712 об'єкт
metamask_v4_compat: true,
});
Типові проблеми
Bridge не запущений. Якщо користувач не встановив Trezor Suite Bridge та браузер не підтримує WebUSB — SDK не знайде пристрій. Рішення: в UI спрямовувати на сторінку встановлення, детектувати через TrezorConnect.getFeatures().
Popup заблокований. @trezor/connect-web відкриває popup для відображення дозволів. Браузерні блокувальники popup можуть це запобігти. Потрібно ініціювати виклики лише з user gesture (click).
Версія firmware. Старий firmware не підтримує EIP-1559 транзакції. Рекомендується перевіряти версію через TrezorConnect.getFeatures() та показувати попередження про оновлення.
Відмінності від Ledger в реалізації
| Аспект | Ledger | Trezor |
|---|---|---|
| Транспорт | WebHID/WebUSB напрямку | iframe + Bridge/WebUSB |
| Залежність від інфраструктури | Ні | connect.trezor.io |
| Формат транзакції | RLP-encoded | Об'єкт з полями |
| Offline використання | Так | Обмежено |
| EIP-712 на бюджетних моделях | Обмежено | metamask_v4_compat |
Базова інтеграція з Trezor (адреса + підпис транзакцій + EIP-712) — 1–2 тиж включаючи тестування на Model T та Model One та обробку всіх edge cases.







