Skip to content

Commit a496574

Browse files
committed
feat: add cold wallet feature flags
- identify precisely which coins support cold wallets Ticket: CE-1156
1 parent c66e346 commit a496574

File tree

7 files changed

+211
-20
lines changed

7 files changed

+211
-20
lines changed

modules/statics/src/ada.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export class Ada extends BaseCoin {
1717
public static readonly DEFAULT_FEATURES = [
1818
CoinFeature.UNSPENT_MODEL,
1919
CoinFeature.TSS,
20+
CoinFeature.TSS_COLD,
2021
CoinFeature.CUSTODY,
2122
CoinFeature.TRANSACTION_DATA,
2223
CoinFeature.REQUIRES_BIG_NUMBER,

modules/statics/src/avaxp.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export class AVAXPCoin extends BaseCoin {
1919
CoinFeature.CUSTODY_BITGO_TRUST,
2020
CoinFeature.CUSTODY_BITGO_GERMANY,
2121
CoinFeature.CUSTODY_BITGO_FRANKFURT,
22+
CoinFeature.MULTISIG_COLD,
2223
];
2324

2425
/**

modules/statics/src/base.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,14 @@ export enum CoinFeature {
195195
* This coin has transactions that expire after a certain amount of time.
196196
*/
197197
EXPIRING_TRANSACTIONS = 'expiring-transactions',
198+
/**
199+
* This coin supports cold wallets that use a multisig signing protocol
200+
*/
201+
MULTISIG_COLD = 'multisig-cold',
202+
/**
203+
* This coin supports cold wallets that use a TSS signing protocol
204+
*/
205+
TSS_COLD = 'tss-cold',
198206
}
199207

200208
/**

modules/statics/src/coins.ts

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -77,56 +77,76 @@ const ETC_FEATURES = [
7777
CoinFeature.CUSTODY_BITGO_GERMANY,
7878
CoinFeature.CUSTODY_BITGO_FRANKFURT,
7979
CoinFeature.CUSTODY_BITGO_NEW_YORK,
80+
CoinFeature.MULTISIG_COLD,
8081
];
8182

8283
const AVAXC_FEATURES = [
8384
...ETH_FEATURES_WITH_MMI,
8485
CoinFeature.CUSTODY_BITGO_GERMANY,
8586
CoinFeature.CUSTODY_BITGO_FRANKFURT,
87+
CoinFeature.MULTISIG_COLD,
88+
];
89+
const CELO_FEATURES = [
90+
...ETH_FEATURES,
91+
CoinFeature.CUSTODY_BITGO_GERMANY,
92+
CoinFeature.CUSTODY_BITGO_FRANKFURT,
93+
CoinFeature.MULTISIG_COLD,
8694
];
87-
const CELO_FEATURES = [...ETH_FEATURES, CoinFeature.CUSTODY_BITGO_GERMANY, CoinFeature.CUSTODY_BITGO_FRANKFURT];
8895
const ETH2_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.SUPPORTS_TOKENS];
8996
const LTC_FEATURES = [
9097
...UtxoCoin.DEFAULT_FEATURES,
9198
CoinFeature.CUSTODY_BITGO_GERMANY,
9299
CoinFeature.CUSTODY_BITGO_NEW_YORK,
93100
CoinFeature.CUSTODY_BITGO_FRANKFURT,
94101
];
95-
const RBTC_FEATURES = [...ETH_FEATURES, CoinFeature.CUSTODY_BITGO_GERMANY, CoinFeature.CUSTODY_BITGO_FRANKFURT];
102+
const RBTC_FEATURES = [
103+
...ETH_FEATURES,
104+
CoinFeature.MULTISIG_COLD,
105+
CoinFeature.CUSTODY_BITGO_GERMANY,
106+
CoinFeature.CUSTODY_BITGO_FRANKFURT,
107+
];
96108
const XLM_FEATURES = [
97109
...AccountCoin.DEFAULT_FEATURES,
98110
CoinFeature.SUPPORTS_TOKENS,
99111
CoinFeature.CUSTODY_BITGO_GERMANY,
100112
CoinFeature.CUSTODY_BITGO_NEW_YORK,
101113
CoinFeature.CUSTODY_BITGO_FRANKFURT,
114+
CoinFeature.MULTISIG_COLD,
102115
];
103-
const XTZ_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.ENTERPRISE_PAYS_FEES].filter(
104-
(feature) => feature !== CoinFeature.CUSTODY && feature !== CoinFeature.CUSTODY_BITGO_TRUST
105-
);
116+
const XTZ_FEATURES = [
117+
...AccountCoin.DEFAULT_FEATURES,
118+
CoinFeature.MULTISIG_COLD,
119+
CoinFeature.ENTERPRISE_PAYS_FEES,
120+
].filter((feature) => feature !== CoinFeature.CUSTODY && feature !== CoinFeature.CUSTODY_BITGO_TRUST);
121+
106122
const XRP_FEATURES = [
107123
...AccountCoin.DEFAULT_FEATURES,
108124
CoinFeature.SUPPORTS_TOKENS,
109125
CoinFeature.CUSTODY_BITGO_GERMANY,
110126
CoinFeature.CUSTODY_BITGO_NEW_YORK,
111127
CoinFeature.CUSTODY_BITGO_FRANKFURT,
128+
CoinFeature.MULTISIG_COLD,
112129
];
113130
const CSPR_FEATURES = [
114131
...AccountCoin.DEFAULT_FEATURES,
115132
CoinFeature.REQUIRES_RESERVE,
116133
CoinFeature.CUSTODY_BITGO_GERMANY,
117134
CoinFeature.CUSTODY_BITGO_SWITZERLAND,
118135
CoinFeature.CUSTODY_BITGO_FRANKFURT,
136+
CoinFeature.MULTISIG_COLD,
119137
];
120138
const ALGO_FEATURES = [
121139
...AccountCoin.DEFAULT_FEATURES,
122140
CoinFeature.SUPPORTS_TOKENS,
123141
CoinFeature.CUSTODY_BITGO_SWITZERLAND,
124142
CoinFeature.CUSTODY_BITGO_GERMANY,
125143
CoinFeature.CUSTODY_BITGO_FRANKFURT,
144+
CoinFeature.MULTISIG_COLD,
126145
];
127146
const DOT_FEATURES = [
128147
...AccountCoin.DEFAULT_FEATURES,
129148
CoinFeature.TSS,
149+
CoinFeature.TSS_COLD,
130150
CoinFeature.STAKING,
131151
CoinFeature.EXPIRING_TRANSACTIONS,
132152
];
@@ -140,16 +160,20 @@ const EOS_FEATURES = [
140160
CoinFeature.SUPPORTS_TOKENS,
141161
CoinFeature.CUSTODY_BITGO_GERMANY,
142162
CoinFeature.CUSTODY_BITGO_FRANKFURT,
163+
CoinFeature.MULTISIG_COLD,
143164
];
144165
const HBAR_FEATURES = [
145166
...AccountCoin.DEFAULT_FEATURES,
146167
CoinFeature.SUPPORTS_TOKENS,
147168
CoinFeature.CUSTODY_BITGO_GERMANY,
148169
CoinFeature.CUSTODY_BITGO_FRANKFURT,
170+
CoinFeature.MULTISIG_COLD,
149171
];
150172
const POLYGON_FEATURES = [
151173
...ETH_FEATURES_WITH_STAKING_AND_MMI,
152174
CoinFeature.TSS,
175+
CoinFeature.TSS_COLD,
176+
CoinFeature.MULTISIG_COLD,
153177
CoinFeature.EVM_WALLET,
154178
CoinFeature.CUSTODY_BITGO_GERMANY,
155179
CoinFeature.CUSTODY_BITGO_SWITZERLAND,
@@ -158,6 +182,7 @@ const POLYGON_FEATURES = [
158182
const SOL_FEATURES = [
159183
...AccountCoin.DEFAULT_FEATURES,
160184
CoinFeature.TSS,
185+
CoinFeature.TSS_COLD,
161186
CoinFeature.REQUIRES_RESERVE,
162187
CoinFeature.SUPPORTS_TOKENS,
163188
CoinFeature.STAKING,
@@ -168,28 +193,36 @@ const STX_FEATURES = [
168193
...AccountCoin.DEFAULT_FEATURES,
169194
CoinFeature.CUSTODY_BITGO_GERMANY,
170195
CoinFeature.CUSTODY_BITGO_FRANKFURT,
196+
CoinFeature.MULTISIG_COLD,
171197
];
172-
const NEAR_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
198+
const NEAR_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.STAKING];
173199
const MATIC_FEATURES = [
174200
...AccountCoin.DEFAULT_FEATURES,
175201
CoinFeature.STAKING,
202+
CoinFeature.MULTISIG_COLD,
176203
CoinFeature.METAMASK_INSTITUTIONAL,
177204
CoinFeature.CUSTODY_BITGO_SWITZERLAND,
178205
];
179-
const SUI_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
206+
const SUI_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.STAKING];
180207
const TRX_FEATURES = [
181208
...AccountCoin.DEFAULT_FEATURES,
182209
CoinFeature.SUPPORTS_TOKENS,
183210
CoinFeature.CUSTODY_BITGO_GERMANY,
184211
CoinFeature.CUSTODY_BITGO_FRANKFURT,
212+
CoinFeature.MULTISIG_COLD,
213+
];
214+
const ATOM_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.STAKING];
215+
const OSMO_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.STAKING];
216+
const TIA_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.STAKING];
217+
const HASH_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.STAKING];
218+
const BLD_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.STAKING];
219+
const SEI_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.STAKING];
220+
const INJECTIVE_FEATURES = [
221+
...AccountCoin.DEFAULT_FEATURES,
222+
CoinFeature.TSS,
223+
CoinFeature.TSS_COLD,
224+
CoinFeature.STAKING,
185225
];
186-
const ATOM_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
187-
const OSMO_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
188-
const TIA_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
189-
const HASH_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
190-
const BLD_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
191-
const SEI_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
192-
const INJECTIVE_FEATURES = [...AccountCoin.DEFAULT_FEATURES, CoinFeature.TSS, CoinFeature.STAKING];
193226

194227
const GENERIC_TOKEN_FEATURES = [
195228
CoinFeature.ACCOUNT_MODEL,
@@ -286,7 +319,7 @@ export const coins = CoinMap.fromCoins([
286319
Networks.test.bitcoinGold,
287320
UnderlyingAsset.BTG,
288321
BaseUnit.BTC,
289-
BTG_FEATURES
322+
BTG_FEATURES.filter((f) => f !== CoinFeature.MULTISIG_COLD)
290323
),
291324
utxo(
292325
'9c8097f1-5d2c-4a62-a94c-96c271c0e5e0',
@@ -453,6 +486,8 @@ export const coins = CoinMap.fromCoins([
453486
[
454487
...ETH_FEATURES_WITH_STAKING_AND_MMI,
455488
CoinFeature.TSS,
489+
CoinFeature.TSS_COLD,
490+
CoinFeature.MULTISIG_COLD,
456491
CoinFeature.EVM_WALLET,
457492
CoinFeature.CUSTODY_BITGO_GERMANY,
458493
CoinFeature.CUSTODY_BITGO_NEW_YORK,
@@ -481,6 +516,8 @@ export const coins = CoinMap.fromCoins([
481516
[
482517
...ETH_FEATURES_WITH_STAKING_AND_MMI,
483518
CoinFeature.TSS,
519+
CoinFeature.TSS_COLD,
520+
CoinFeature.MULTISIG_COLD,
484521
CoinFeature.EVM_WALLET,
485522
CoinFeature.CUSTODY_BITGO_GERMANY,
486523
CoinFeature.CUSTODY_BITGO_NEW_YORK,
@@ -496,7 +533,7 @@ export const coins = CoinMap.fromCoins([
496533
18,
497534
UnderlyingAsset.ETH2,
498535
BaseUnit.ETH,
499-
[...ETH2_FEATURES, CoinFeature.TSS],
536+
[...ETH2_FEATURES, CoinFeature.TSS, CoinFeature.MULTISIG_COLD, CoinFeature.TSS_COLD],
500537
KeyCurve.BLS
501538
),
502539
account(
@@ -507,7 +544,7 @@ export const coins = CoinMap.fromCoins([
507544
18,
508545
UnderlyingAsset.ETHW,
509546
BaseUnit.ETH,
510-
AccountCoin.DEFAULT_FEATURES
547+
[...AccountCoin.DEFAULT_FEATURES]
511548
),
512549
account(
513550
'37ee6253-04fb-4eec-bd88-310a480b1e43',
@@ -517,7 +554,7 @@ export const coins = CoinMap.fromCoins([
517554
18,
518555
UnderlyingAsset.ETH2,
519556
BaseUnit.ETH,
520-
ETH2_FEATURES,
557+
[...ETH2_FEATURES, CoinFeature.TSS, CoinFeature.MULTISIG_COLD, CoinFeature.TSS_COLD],
521558
KeyCurve.BLS
522559
),
523560
account(
@@ -914,7 +951,7 @@ export const coins = CoinMap.fromCoins([
914951
18,
915952
UnderlyingAsset.BSC,
916953
BaseUnit.BSC,
917-
[...ETH_FEATURES_WITH_MMI, CoinFeature.TSS, CoinFeature.EVM_WALLET]
954+
[...ETH_FEATURES_WITH_MMI, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.EVM_WALLET]
918955
),
919956
account(
920957
'0a205427-f7c9-48a4-a238-c4b33ba6384d',
@@ -924,7 +961,7 @@ export const coins = CoinMap.fromCoins([
924961
18,
925962
UnderlyingAsset.BSC,
926963
BaseUnit.BSC,
927-
[...ETH_FEATURES_WITH_MMI, CoinFeature.TSS, CoinFeature.EVM_WALLET]
964+
[...ETH_FEATURES_WITH_MMI, CoinFeature.TSS, CoinFeature.TSS_COLD, CoinFeature.EVM_WALLET]
928965
),
929966
account(
930967
'f0e226b6-6cd8-4384-b0a5-ba8e4148a049',

modules/statics/src/utxo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export class UtxoCoin extends BaseCoin {
2020
CoinFeature.CHILD_PAYS_FOR_PARENT,
2121
CoinFeature.CUSTODY,
2222
CoinFeature.CUSTODY_BITGO_TRUST,
23+
CoinFeature.MULTISIG_COLD,
2324
];
2425

2526
/**

modules/statics/test/unit/coins.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
UtxoCoin,
1515
} from '../../src';
1616
import { utxo } from '../../src/utxo';
17+
import { expectedColdFeatures } from './fixtures/expectedColdFeatures';
1718

1819
interface DuplicateCoinObject {
1920
name: string;
@@ -329,3 +330,54 @@ describe('ERC20 Coins', () => {
329330
}, {});
330331
});
331332
});
333+
334+
describe('Cold Wallet Features', () => {
335+
it('Coins that support both multisig & tss cold should have expected flags', () => {
336+
const both = coins
337+
.filter(
338+
(coin) =>
339+
!coin.isToken &&
340+
coin.features.includes(CoinFeature.MULTISIG_COLD) &&
341+
coin.features.includes(CoinFeature.TSS_COLD)
342+
)
343+
.map((coin) => coin.name)
344+
.sort();
345+
both.should.deepEqual(expectedColdFeatures.both.sort());
346+
});
347+
it('Coins that support just multisig cold should have expected flags', () => {
348+
const justMultiSig = coins
349+
.filter(
350+
(coin) =>
351+
!coin.isToken &&
352+
coin.features.includes(CoinFeature.MULTISIG_COLD) &&
353+
!coin.features.includes(CoinFeature.TSS_COLD)
354+
)
355+
.map((coin) => coin.name)
356+
.sort();
357+
justMultiSig.should.deepEqual(expectedColdFeatures.justMultiSig.sort());
358+
});
359+
it('Coins that support just tss cold should have expected flags', () => {
360+
const justTSS = coins
361+
.filter(
362+
(coin) =>
363+
!coin.isToken &&
364+
!coin.features.includes(CoinFeature.MULTISIG_COLD) &&
365+
coin.features.includes(CoinFeature.TSS_COLD)
366+
)
367+
.map((coin) => coin.name)
368+
.sort();
369+
justTSS.should.deepEqual(expectedColdFeatures.justTSS.sort());
370+
});
371+
it('Coins that dont support cold wallets at all should not have either flag', () => {
372+
const neither = coins
373+
.filter(
374+
(coin) =>
375+
!coin.isToken &&
376+
!coin.features.includes(CoinFeature.MULTISIG_COLD) &&
377+
!coin.features.includes(CoinFeature.TSS_COLD)
378+
)
379+
.map((coin) => coin.name)
380+
.sort();
381+
neither.should.deepEqual(expectedColdFeatures.neither.sort());
382+
});
383+
});

0 commit comments

Comments
 (0)