@rango-dev/provider-trezor 0.1.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/dist/helpers.d.ts +9 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +7 -0
- package/dist/provider-trezor.build.json +1 -0
- package/dist/signer.d.ts +3 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signers/ethereum.d.ts +9 -0
- package/dist/signers/ethereum.d.ts.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +33 -0
- package/readme.md +1 -0
- package/src/helpers.ts +58 -0
- package/src/index.ts +67 -0
- package/src/signer.ts +11 -0
- package/src/signers/ethereum.ts +94 -0
- package/src/types.ts +3 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const ETHEREUM_BIP32_PATH = "m/44'/60'/0'/0/0";
|
|
2
|
+
export declare function getTrezorErrorMessage(error: any): Error;
|
|
3
|
+
export declare function getTrezorInstance(): Map<any, any>;
|
|
4
|
+
export declare function getEthereumAccounts(path: string): Promise<{
|
|
5
|
+
accounts: string[];
|
|
6
|
+
chainId: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare const valueToHex: (value: string) => string;
|
|
9
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AAEtD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,SAS/C;AAED,wBAAgB,iBAAiB,kBAUhC;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAcD;AAMD,eAAO,MAAM,UAAU,UAAW,MAAM,WAMvC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Environments } from './types';
|
|
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';
|
|
6
|
+
export declare const config: {
|
|
7
|
+
type: WalletTypes;
|
|
8
|
+
};
|
|
9
|
+
export type { Environments };
|
|
10
|
+
export declare const init: (environments: Environments) => void;
|
|
11
|
+
export declare const getInstance: typeof getTrezorInstance;
|
|
12
|
+
export declare const connect: Connect;
|
|
13
|
+
export declare const getSigners: (provider: any) => SignerFactory;
|
|
14
|
+
export declare const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAGL,iBAAiB,EAClB,MAAM,WAAW,CAAC;AAOnB,eAAO,MAAM,MAAM;;CAElB,CAAC;AAEF,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,eAAO,MAAM,IAAI,iBAAkB,YAAY,SAE9C,CAAC;AAEF,eAAO,MAAM,WAAW,0BAAoB,CAAC;AAG7C,eAAO,MAAM,OAAO,EAAE,OAWrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,aAAsB,CAAC;AAEnE,eAAO,MAAM,aAAa,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,UAqBjE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var B=Object.defineProperty;var e=(t,r)=>B(t,"name",{value:r,configurable:!0});import{Networks as k,WalletTypes as L}from"@rango-dev/wallets-shared";import{cleanEvmError as F}from"@rango-dev/signer-evm";import{ETHEREUM_CHAIN_ID as h,Networks as _}from"@rango-dev/wallets-shared";var c="m/44'/60'/0'/0/0";function T(t){return t?.shortMessage?new Error(t.shortMessage,{cause:t}):F(t)}e(T,"getTrezorErrorMessage");function y(){let t=new Map;return t.set(_.ETHEREUM,{chainId:h}),t}e(y,"getTrezorInstance");async function w(t){let{default:r}=await import("@trezor/connect-web"),n=await r.ethereumGetAddress({path:t});if(!n.success)throw new Error(n.payload.error);return{accounts:[n.payload.address],chainId:h}}e(w,"getEthereumAccounts");var o=e(t=>{let r=BigInt(0);return BigInt(t)>r?`0x${BigInt(t).toString(16)}`:"0x0"},"valueToHex");import{DefaultSignerFactory as G,TransactionType as b}from"rango-types";import{DEFAULT_ETHEREUM_RPC_URL as A}from"@rango-dev/wallets-shared";import{JsonRpcProvider as C,Transaction as U}from"ethers";var m=class{static{e(this,"EthereumSigner")}async signMessage(r){let{default:n}=await import("@trezor/connect-web"),{success:s,payload:a}=await n.signMessage({message:r,path:c});if(!s)throw new Error(a.error);return a.signature}async signAndSendTx(r,n,s){try{let{default:a}=await import("@trezor/connect-web"),{gasPrice:E,maxFeePerGas:p,maxPriorityFeePerGas:g}=r,i=p&&g;if(i&&!p)throw new Error("Missing maxFeePerGas");if(i&&!g)throw new Error("Missing maxPriorityFeePerGas");if(!i&&!E)throw new Error("Missing gasPrice");let f=new C(A),P=await f.getTransactionCount(n),M=i?{maxFeePerGas:o(p||"0"),maxPriorityFeePerGas:o(g||"0")}:{gasPrice:o(E||"0")},l={to:r.to,data:r.data||"0x",value:o(r.value?.toString()||"0"),gasLimit:o(r.gasLimit?.toString()||"0"),chainId:Number.parseInt(s),nonce:o(P.toString()),...M},{success:v,payload:d}=await a.ethereumSignTransaction({path:c,transaction:l});if(!v)throw new Error(d.error);let{r:z,s:S,v:H}=d,R=U.from({...l,nonce:Number.parseInt(l.nonce),type:i?2:0,signature:{r:z,s:S,v:parseInt(H)}}).serialized;return{hash:(await f.broadcastTransaction(R)).hash}}catch(a){throw T(a)}}};function u(){let t=new G;return t.registerSigner(b.EVM,new m),t}e(u,"getSigners");var I={appUrl:"",email:""},ot={type:L.TREZOR},at=e(t=>{I=t.manifest},"init"),st=y,x=!1,it=e(async()=>{let{default:t}=await import("@trezor/connect-web");return x||(await t.init({lazyLoad:!0,manifest:I}),x=!0),await w(c)},"connect"),ct=u,mt=e(t=>{let r=[],n=t.find(s=>s.name===k.ETHEREUM);return n&&r.push(n),{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:r,showOnMobile:!1}},"getWalletInfo");export{ot as config,it as connect,st as getInstance,ct as getSigners,mt as getWalletInfo,at as init};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/helpers.ts", "../src/signer.ts", "../src/signers/ethereum.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Environments } from './types';\nimport type { Connect, WalletInfo } 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 ETHEREUM_BIP32_PATH,\n getEthereumAccounts,\n getTrezorInstance,\n} from './helpers';\nimport signer from './signer';\n\nlet trezorManifest: Environments['manifest'] = {\n appUrl: '',\n email: '',\n};\nexport const config = {\n type: WalletTypes.TREZOR,\n};\n\nexport type { Environments };\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 () => {\n const { default: TrezorConnect } = await import('@trezor/connect-web');\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 isTrezorInitialized = true;\n }\n return await getEthereumAccounts(ETHEREUM_BIP32_PATH);\n};\n\nexport const getSigners: (provider: any) => SignerFactory = 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 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};\n", "import { cleanEvmError } from '@rango-dev/signer-evm';\nimport { ETHEREUM_CHAIN_ID, Networks } from '@rango-dev/wallets-shared';\n\nexport const ETHEREUM_BIP32_PATH = \"m/44'/60'/0'/0/0\";\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 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(path: string): Promise<{\n accounts: string[];\n chainId: string;\n}> {\n const { default: TrezorConnect } = await import('@trezor/connect-web');\n const result = await TrezorConnect.ethereumGetAddress({\n path,\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 };\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", "import type { SignerFactory } from 'rango-types';\n\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nimport { EthereumSigner } from './signers/ethereum';\n\nexport default function getSigners(): SignerFactory {\n const signers = new DefaultSignerFactory();\n signers.registerSigner(TxType.EVM, new EthereumSigner());\n return signers;\n}\n", "import type { EvmTransaction } from 'rango-types/lib/api/main';\n\nimport { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/wallets-shared';\nimport { JsonRpcProvider, Transaction } from 'ethers';\nimport { type GenericSigner } from 'rango-types';\n\nimport {\n ETHEREUM_BIP32_PATH,\n getTrezorErrorMessage,\n valueToHex,\n} from '../helpers';\n\nexport class EthereumSigner implements GenericSigner<EvmTransaction> {\n async signMessage(msg: string): Promise<string> {\n const { default: TrezorConnect } = await import('@trezor/connect-web');\n\n const { success, payload } = await TrezorConnect.signMessage({\n message: msg,\n path: ETHEREUM_BIP32_PATH,\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 { default: TrezorConnect } = await import('@trezor/connect-web');\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: ETHEREUM_BIP32_PATH,\n transaction,\n });\n if (!success) {\n throw new Error(payload.error);\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": "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",
|
|
6
|
+
"names": ["Networks", "WalletTypes", "cleanEvmError", "ETHEREUM_CHAIN_ID", "Networks", "ETHEREUM_BIP32_PATH", "getTrezorErrorMessage", "error", "cleanEvmError", "__name", "getTrezorInstance", "instances", "Networks", "ETHEREUM_CHAIN_ID", "getEthereumAccounts", "path", "TrezorConnect", "result", "valueToHex", "value", "ZERO_BIGINT", "DefaultSignerFactory", "TxType", "DEFAULT_ETHEREUM_RPC_URL", "JsonRpcProvider", "Transaction", "EthereumSigner", "__name", "msg", "TrezorConnect", "success", "payload", "ETHEREUM_BIP32_PATH", "tx", "fromAddress", "chainId", "gasPrice", "maxFeePerGas", "maxPriorityFeePerGas", "isEIP1559", "provider", "JsonRpcProvider", "DEFAULT_ETHEREUM_RPC_URL", "transactionCount", "additionalFields", "valueToHex", "transaction", "r", "s", "v", "serializedTx", "Transaction", "error", "getTrezorErrorMessage", "getSigners", "signers", "DefaultSignerFactory", "TxType", "EthereumSigner", "__name", "trezorManifest", "config", "WalletTypes", "init", "__name", "environments", "getInstance", "getTrezorInstance", "isTrezorInitialized", "connect", "TrezorConnect", "getEthereumAccounts", "ETHEREUM_BIP32_PATH", "getSigners", "getWalletInfo", "allBlockChains", "supportedChains", "ethereumBlockchain", "chain", "Networks"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"inputs":{"src/helpers.ts":{"bytes":1679,"imports":[{"path":"@rango-dev/signer-evm","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/signers/ethereum.ts":{"bytes":3206,"imports":[{"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"},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/signer.ts":{"bytes":365,"imports":[{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/signers/ethereum.ts","kind":"import-statement","original":"./signers/ethereum"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":1861,"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"},{"path":"src/signer.ts","kind":"import-statement","original":"./signer"},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":11837},"dist/index.js":{"imports":[{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"@rango-dev/signer-evm","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"ethers","kind":"import-statement","external":true},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true},{"path":"@trezor/connect-web","kind":"dynamic-import","external":true}],"exports":["config","connect","getInstance","getSigners","getWalletInfo","init"],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":630},"src/helpers.ts":{"bytesInOutput":682},"src/signer.ts":{"bytesInOutput":154},"src/signers/ethereum.ts":{"bytesInOutput":1243}},"bytes":2924}}}
|
package/dist/signer.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD,MAAM,CAAC,OAAO,UAAU,UAAU,IAAI,aAAa,CAIlD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EvmTransaction } from 'rango-types/lib/api/main';
|
|
2
|
+
import { type GenericSigner } from 'rango-types';
|
|
3
|
+
export declare class EthereumSigner implements GenericSigner<EvmTransaction> {
|
|
4
|
+
signMessage(msg: string): Promise<string>;
|
|
5
|
+
signAndSendTx(tx: EvmTransaction, fromAddress: string, chainId: string): Promise<{
|
|
6
|
+
hash: string;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ethereum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ethereum.d.ts","sourceRoot":"","sources":["../../src/signers/ethereum.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,qBAAa,cAAe,YAAW,aAAa,CAAC,cAAc,CAAC;IAC5D,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAazC,aAAa,CACjB,EAAE,EAAE,cAAc,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CA+D7B"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rango-dev/provider-trezor",
|
|
3
|
+
"version": "0.1.1-next.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"source": "./src/index.ts",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"typings": "dist/index.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"src"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "node ../../scripts/build/command.mjs --path wallets/provider-trezor",
|
|
18
|
+
"ts-check": "tsc --declaration --emitDeclarationOnly -p ./tsconfig.json",
|
|
19
|
+
"clean": "rimraf dist",
|
|
20
|
+
"format": "prettier --write '{.,src}/**/*.{ts,tsx}'",
|
|
21
|
+
"lint": "eslint \"**/*.{ts,tsx}\" --ignore-path ../../.eslintignore"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@rango-dev/signer-evm": "^0.27.2-next.1",
|
|
25
|
+
"@rango-dev/wallets-shared": "^0.34.1-next.5",
|
|
26
|
+
"@trezor/connect-web": "^9.2.4",
|
|
27
|
+
"ethers": "^6.11.1",
|
|
28
|
+
"rango-types": "^0.1.59"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
}
|
|
33
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @rango-dev/provider-trezor
|
package/src/helpers.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { cleanEvmError } from '@rango-dev/signer-evm';
|
|
2
|
+
import { ETHEREUM_CHAIN_ID, Networks } from '@rango-dev/wallets-shared';
|
|
3
|
+
|
|
4
|
+
export const ETHEREUM_BIP32_PATH = "m/44'/60'/0'/0/0";
|
|
5
|
+
|
|
6
|
+
export function getTrezorErrorMessage(error: any) {
|
|
7
|
+
if (error?.shortMessage) {
|
|
8
|
+
/*
|
|
9
|
+
* Some error signs have lengthy, challenging-to-read messages.
|
|
10
|
+
* shortMessage is used because it is shorter and easier to understand.
|
|
11
|
+
*/
|
|
12
|
+
return new Error(error.shortMessage, { cause: error });
|
|
13
|
+
}
|
|
14
|
+
return cleanEvmError(error);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function getTrezorInstance() {
|
|
18
|
+
/*
|
|
19
|
+
* Instances have a required property which is `chainId` and is using in swap execution.
|
|
20
|
+
* Here we are setting it as Ethereum always since we are supporting only eth for now.
|
|
21
|
+
*/
|
|
22
|
+
const instances = new Map();
|
|
23
|
+
|
|
24
|
+
instances.set(Networks.ETHEREUM, { chainId: ETHEREUM_CHAIN_ID });
|
|
25
|
+
|
|
26
|
+
return instances;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function getEthereumAccounts(path: string): Promise<{
|
|
30
|
+
accounts: string[];
|
|
31
|
+
chainId: string;
|
|
32
|
+
}> {
|
|
33
|
+
const { default: TrezorConnect } = await import('@trezor/connect-web');
|
|
34
|
+
const result = await TrezorConnect.ethereumGetAddress({
|
|
35
|
+
path,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
if (!result.success) {
|
|
39
|
+
throw new Error(result.payload.error);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
accounts: [result.payload.address],
|
|
44
|
+
chainId: ETHEREUM_CHAIN_ID,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* Using BigInt in the valueToHex function ensures that the function
|
|
50
|
+
* can handle very large integer values that exceed the range of standard JavaScript number types.
|
|
51
|
+
*/
|
|
52
|
+
export const valueToHex = (value: string) => {
|
|
53
|
+
const ZERO_BIGINT = BigInt(0);
|
|
54
|
+
const HEX_BASE = 16;
|
|
55
|
+
return BigInt(value) > ZERO_BIGINT
|
|
56
|
+
? `0x${BigInt(value).toString(HEX_BASE)}`
|
|
57
|
+
: '0x0';
|
|
58
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Environments } from './types';
|
|
2
|
+
import type { Connect, WalletInfo } from '@rango-dev/wallets-shared';
|
|
3
|
+
|
|
4
|
+
import { Networks, WalletTypes } from '@rango-dev/wallets-shared';
|
|
5
|
+
import { type BlockchainMeta, type SignerFactory } from 'rango-types';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
ETHEREUM_BIP32_PATH,
|
|
9
|
+
getEthereumAccounts,
|
|
10
|
+
getTrezorInstance,
|
|
11
|
+
} from './helpers';
|
|
12
|
+
import signer from './signer';
|
|
13
|
+
|
|
14
|
+
let trezorManifest: Environments['manifest'] = {
|
|
15
|
+
appUrl: '',
|
|
16
|
+
email: '',
|
|
17
|
+
};
|
|
18
|
+
export const config = {
|
|
19
|
+
type: WalletTypes.TREZOR,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export type { Environments };
|
|
23
|
+
|
|
24
|
+
export const init = (environments: Environments) => {
|
|
25
|
+
trezorManifest = environments.manifest;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const getInstance = getTrezorInstance;
|
|
29
|
+
|
|
30
|
+
let isTrezorInitialized = false;
|
|
31
|
+
export const connect: Connect = async () => {
|
|
32
|
+
const { default: TrezorConnect } = await import('@trezor/connect-web');
|
|
33
|
+
|
|
34
|
+
if (!isTrezorInitialized) {
|
|
35
|
+
await TrezorConnect.init({
|
|
36
|
+
lazyLoad: true, // this param will prevent iframe injection until TrezorConnect.method will be called
|
|
37
|
+
manifest: trezorManifest,
|
|
38
|
+
});
|
|
39
|
+
isTrezorInitialized = true;
|
|
40
|
+
}
|
|
41
|
+
return await getEthereumAccounts(ETHEREUM_BIP32_PATH);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const getSigners: (provider: any) => SignerFactory = signer;
|
|
45
|
+
|
|
46
|
+
export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
|
|
47
|
+
allBlockChains
|
|
48
|
+
) => {
|
|
49
|
+
const supportedChains: BlockchainMeta[] = [];
|
|
50
|
+
|
|
51
|
+
const ethereumBlockchain = allBlockChains.find(
|
|
52
|
+
(chain) => chain.name === Networks.ETHEREUM
|
|
53
|
+
);
|
|
54
|
+
if (ethereumBlockchain) {
|
|
55
|
+
supportedChains.push(ethereumBlockchain);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
name: 'Trezor',
|
|
59
|
+
img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/trezor/icon.svg',
|
|
60
|
+
installLink: {
|
|
61
|
+
DEFAULT: 'https://trezor.io/learn/a/download-verify-trezor-suite',
|
|
62
|
+
},
|
|
63
|
+
color: 'black',
|
|
64
|
+
supportedChains,
|
|
65
|
+
showOnMobile: false,
|
|
66
|
+
};
|
|
67
|
+
};
|
package/src/signer.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SignerFactory } from 'rango-types';
|
|
2
|
+
|
|
3
|
+
import { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';
|
|
4
|
+
|
|
5
|
+
import { EthereumSigner } from './signers/ethereum';
|
|
6
|
+
|
|
7
|
+
export default function getSigners(): SignerFactory {
|
|
8
|
+
const signers = new DefaultSignerFactory();
|
|
9
|
+
signers.registerSigner(TxType.EVM, new EthereumSigner());
|
|
10
|
+
return signers;
|
|
11
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { EvmTransaction } from 'rango-types/lib/api/main';
|
|
2
|
+
|
|
3
|
+
import { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/wallets-shared';
|
|
4
|
+
import { JsonRpcProvider, Transaction } from 'ethers';
|
|
5
|
+
import { type GenericSigner } from 'rango-types';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
ETHEREUM_BIP32_PATH,
|
|
9
|
+
getTrezorErrorMessage,
|
|
10
|
+
valueToHex,
|
|
11
|
+
} from '../helpers';
|
|
12
|
+
|
|
13
|
+
export class EthereumSigner implements GenericSigner<EvmTransaction> {
|
|
14
|
+
async signMessage(msg: string): Promise<string> {
|
|
15
|
+
const { default: TrezorConnect } = await import('@trezor/connect-web');
|
|
16
|
+
|
|
17
|
+
const { success, payload } = await TrezorConnect.signMessage({
|
|
18
|
+
message: msg,
|
|
19
|
+
path: ETHEREUM_BIP32_PATH,
|
|
20
|
+
});
|
|
21
|
+
if (!success) {
|
|
22
|
+
throw new Error(payload.error);
|
|
23
|
+
}
|
|
24
|
+
return payload.signature;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async signAndSendTx(
|
|
28
|
+
tx: EvmTransaction,
|
|
29
|
+
fromAddress: string,
|
|
30
|
+
chainId: string
|
|
31
|
+
): Promise<{ hash: string }> {
|
|
32
|
+
try {
|
|
33
|
+
const { default: TrezorConnect } = await import('@trezor/connect-web');
|
|
34
|
+
const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = tx;
|
|
35
|
+
const isEIP1559 = maxFeePerGas && maxPriorityFeePerGas;
|
|
36
|
+
|
|
37
|
+
if (isEIP1559 && !maxFeePerGas) {
|
|
38
|
+
throw new Error('Missing maxFeePerGas');
|
|
39
|
+
}
|
|
40
|
+
if (isEIP1559 && !maxPriorityFeePerGas) {
|
|
41
|
+
throw new Error('Missing maxPriorityFeePerGas');
|
|
42
|
+
}
|
|
43
|
+
if (!isEIP1559 && !gasPrice) {
|
|
44
|
+
throw new Error('Missing gasPrice');
|
|
45
|
+
}
|
|
46
|
+
const provider = new JsonRpcProvider(DEFAULT_ETHEREUM_RPC_URL); // Provider to broadcast transaction
|
|
47
|
+
const transactionCount = await provider.getTransactionCount(fromAddress); // Get nonce
|
|
48
|
+
const additionalFields = isEIP1559
|
|
49
|
+
? {
|
|
50
|
+
maxFeePerGas: valueToHex(maxFeePerGas || '0'),
|
|
51
|
+
maxPriorityFeePerGas: valueToHex(maxPriorityFeePerGas || '0'),
|
|
52
|
+
}
|
|
53
|
+
: {
|
|
54
|
+
gasPrice: valueToHex(gasPrice || '0'),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const transaction = {
|
|
58
|
+
to: tx.to,
|
|
59
|
+
data: tx.data || '0x',
|
|
60
|
+
value: valueToHex(tx.value?.toString() || '0'),
|
|
61
|
+
gasLimit: valueToHex(tx.gasLimit?.toString() || '0'),
|
|
62
|
+
chainId: Number.parseInt(chainId),
|
|
63
|
+
nonce: valueToHex(transactionCount.toString()),
|
|
64
|
+
...additionalFields,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const { success, payload } = await TrezorConnect.ethereumSignTransaction({
|
|
68
|
+
path: ETHEREUM_BIP32_PATH,
|
|
69
|
+
transaction,
|
|
70
|
+
});
|
|
71
|
+
if (!success) {
|
|
72
|
+
throw new Error(payload.error);
|
|
73
|
+
}
|
|
74
|
+
const { r, s, v } = payload;
|
|
75
|
+
|
|
76
|
+
const serializedTx = Transaction.from({
|
|
77
|
+
...transaction,
|
|
78
|
+
nonce: Number.parseInt(transaction.nonce),
|
|
79
|
+
/*
|
|
80
|
+
* Type 0: This refers to the legacy transaction type that has been used since Ethereum's inception.
|
|
81
|
+
* Type 2: This refers to the new transaction type introduced with the EIP-1559 (Ethereum Improvement Proposal 1559) update,
|
|
82
|
+
* which was part of the London hard fork.
|
|
83
|
+
*/
|
|
84
|
+
type: isEIP1559 ? 2 : 0,
|
|
85
|
+
signature: { r, s, v: parseInt(v) },
|
|
86
|
+
}).serialized;
|
|
87
|
+
const broadcastResult = await provider.broadcastTransaction(serializedTx);
|
|
88
|
+
|
|
89
|
+
return { hash: broadcastResult.hash };
|
|
90
|
+
} catch (error) {
|
|
91
|
+
throw getTrezorErrorMessage(error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
package/src/types.ts
ADDED