Skip to content

Commit 0935304

Browse files
refactor(connect): add coin symbol cast helper
1 parent ff9205d commit 0935304

5 files changed

Lines changed: 17 additions & 13 deletions

File tree

packages/connect-common/src/types/coinInfo.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ export const coinSymbols = [
179179
// A supported coin symbol, e.g. `'btc'` / `'ada'`. See `coinSymbols`.
180180
export type CoinSymbol = (typeof coinSymbols)[number];
181181

182+
export const asCoinSymbol = (value: string): CoinSymbol => value as CoinSymbol;
183+
182184
const coinSymbolSet: ReadonlySet<string> = new Set(coinSymbols);
183185

184186
// Runtime validation for `CoinSymbol`, derived from the same `coinSymbols` source as the type.

packages/connect/src/core/AbstractMethod.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ERRORS, UI_REQUEST } from '@trezor/connect-common';
1+
import { ERRORS, UI_REQUEST, asCoinSymbol } from '@trezor/connect-common';
22
import type {
33
CallMethodPayload,
44
CallMethodResponse,
@@ -143,7 +143,7 @@ export abstract class AbstractMethod<Name extends CallMethodPayload['method'], P
143143
// to a known `CoinSymbol` (both derive from the same coin definitions), so
144144
// the cast is sound.
145145
private toCoinSymbol(shortcut: string): CoinSymbol {
146-
return shortcut.toLowerCase() as CoinSymbol;
146+
return asCoinSymbol(shortcut.toLowerCase());
147147
}
148148

149149
// Build a `PermissionRequest` for a single coin (or coin-less when `coin` is

packages/connect/src/data/coinInfo.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// origin: https://github.com/trezor/connect/blob/develop/src/js/data/CoinInfo.js
22
import { ERRORS } from '@trezor/connect-common/src/constants';
3-
import type {
4-
BitcoinNetworkInfo,
5-
CoinInfo,
6-
CoinSymbol,
7-
EthereumNetworkInfo,
8-
MiscNetworkInfo,
3+
import {
4+
type BitcoinNetworkInfo,
5+
type CoinInfo,
6+
type CoinSymbol,
7+
type EthereumNetworkInfo,
8+
type MiscNetworkInfo,
9+
asCoinSymbol,
910
} from '@trezor/connect-common/src/types/coinInfo';
1011
import coinsEth from '@trezor/connect-data/files/coins-eth.json';
1112
import coins from '@trezor/connect-data/files/coins.json';
@@ -121,7 +122,7 @@ const getCoinInfo = (coin: CoinSymbol) =>
121122

122123
export const getCoinInfoOrThrow = (coin: string): Readonly<CoinInfo> => {
123124
// `coin` is unvalidated caller input; a non-shortcut resolves to undefined below
124-
const coinInfo = getCoinInfo(coin as CoinSymbol);
125+
const coinInfo = getCoinInfo(asCoinSymbol(coin));
125126
if (!coinInfo) {
126127
throw ERRORS.TypedError('Method_UnknownCoin');
127128
}

packages/connect/src/utils/addressUtils.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { CoinSymbol } from '@trezor/connect-common/src/types/coinInfo';
1+
import { asCoinSymbol } from '@trezor/connect-common';
22

33
import * as fixtures from './__fixtures__/addressUtils';
44
import * as utils from './addressUtils';
@@ -9,15 +9,15 @@ describe('utils/addressUtils', () => {
99
fixtures.validAddresses.forEach(f => {
1010
it(`${f.description} ${f.address}`, () => {
1111
expect(
12-
utils.isValidAddress(f.address, getBitcoinNetwork(f.coin as CoinSymbol)!),
12+
utils.isValidAddress(f.address, getBitcoinNetwork(asCoinSymbol(f.coin))!),
1313
).toEqual(true);
1414
});
1515
});
1616

1717
fixtures.invalidAddresses.forEach(f => {
1818
it(`Invalid ${f.coin} ${f.address}`, () => {
1919
expect(
20-
utils.isValidAddress(f.address, getBitcoinNetwork(f.coin as CoinSymbol)!),
20+
utils.isValidAddress(f.address, getBitcoinNetwork(asCoinSymbol(f.coin))!),
2121
).toEqual(false);
2222
});
2323
});

suite-common/connect-popup/src/permissions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
type EnabledNetwork,
55
GRANTABLE_PERMISSIONS,
66
type PermissionRequest,
7+
asCoinSymbol,
78
isCoinSymbol,
89
} from '@trezor/connect';
910
import { unique } from '@trezor/utils/src/unique';
@@ -108,7 +109,7 @@ export const canonicalizePermissionCoins = (
108109
permissions.map(permission =>
109110
permission.coin === undefined
110111
? permission
111-
: { ...permission, coin: permission.coin.toLowerCase() as CoinSymbol },
112+
: { ...permission, coin: asCoinSymbol(permission.coin.toLowerCase()) },
112113
);
113114

114115
// Union two permission lists, de-duplicated by (permission, coin). `base` comes first, so on a

0 commit comments

Comments
 (0)