@shapeshiftoss/utils 1.0.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.
Files changed (67) hide show
  1. package/dist/assertUnreachable.d.ts +1 -0
  2. package/dist/assertUnreachable.js +3 -0
  3. package/dist/assetData/assetData.test.d.ts +1 -0
  4. package/dist/assetData/assetData.test.js +120 -0
  5. package/dist/assetData/baseAssets.d.ts +20 -0
  6. package/dist/assetData/baseAssets.js +279 -0
  7. package/dist/assetData/constants.d.ts +1 -0
  8. package/dist/assetData/constants.js +10 -0
  9. package/dist/assetData/decodeAssetData.d.ts +7 -0
  10. package/dist/assetData/decodeAssetData.js +94 -0
  11. package/dist/assetData/decodeRelatedAssetIndex.d.ts +3 -0
  12. package/dist/assetData/decodeRelatedAssetIndex.js +10 -0
  13. package/dist/assetData/encodeAssetData.d.ts +4 -0
  14. package/dist/assetData/encodeAssetData.js +68 -0
  15. package/dist/assetData/encodeRelatedAssetIndex.d.ts +3 -0
  16. package/dist/assetData/encodeRelatedAssetIndex.js +16 -0
  17. package/dist/assetData/getBaseAsset.d.ts +3 -0
  18. package/dist/assetData/getBaseAsset.js +44 -0
  19. package/dist/assetData/index.d.ts +7 -0
  20. package/dist/assetData/index.js +7 -0
  21. package/dist/assetData/relatedAssetIndex.test.d.ts +1 -0
  22. package/dist/assetData/relatedAssetIndex.test.js +30 -0
  23. package/dist/assetData/types.d.ts +28 -0
  24. package/dist/assetData/types.js +1 -0
  25. package/dist/baseUnits/baseUnits.d.ts +5 -0
  26. package/dist/baseUnits/baseUnits.js +23 -0
  27. package/dist/baseUnits/baseUnits.test.d.ts +1 -0
  28. package/dist/baseUnits/baseUnits.test.js +30 -0
  29. package/dist/basisPoints.d.ts +23 -0
  30. package/dist/basisPoints.js +39 -0
  31. package/dist/bignumber/bignumber.d.ts +11 -0
  32. package/dist/bignumber/bignumber.js +16 -0
  33. package/dist/bignumber/bignumber.test.d.ts +1 -0
  34. package/dist/bignumber/bignumber.test.js +50 -0
  35. package/dist/chainIdToFeeAsset.d.ts +3 -0
  36. package/dist/chainIdToFeeAsset.js +5 -0
  37. package/dist/chainIdToFeeAssetId.d.ts +2 -0
  38. package/dist/chainIdToFeeAssetId.js +44 -0
  39. package/dist/createThrottle.d.ts +9 -0
  40. package/dist/createThrottle.js +32 -0
  41. package/dist/getAssetNamespaceFromChainId.d.ts +3 -0
  42. package/dist/getAssetNamespaceFromChainId.js +31 -0
  43. package/dist/getChainShortName.d.ts +2 -0
  44. package/dist/getChainShortName.js +43 -0
  45. package/dist/getNativeFeeAssetReference.d.ts +2 -0
  46. package/dist/getNativeFeeAssetReference.js +63 -0
  47. package/dist/historyTimeframe.d.ts +6 -0
  48. package/dist/historyTimeframe.js +29 -0
  49. package/dist/index.d.ts +24 -0
  50. package/dist/index.js +40 -0
  51. package/dist/makeAsset/makeAsset.d.ts +10 -0
  52. package/dist/makeAsset/makeAsset.js +39 -0
  53. package/dist/makeAsset/makeAsset.test.d.ts +1 -0
  54. package/dist/makeAsset/makeAsset.test.js +45 -0
  55. package/dist/promises.d.ts +4 -0
  56. package/dist/promises.js +3 -0
  57. package/dist/sha256.d.ts +1 -0
  58. package/dist/sha256.js +2 -0
  59. package/dist/timeout.d.ts +3 -0
  60. package/dist/timeout.js +17 -0
  61. package/dist/treasury.d.ts +15 -0
  62. package/dist/treasury.js +29 -0
  63. package/dist/unfreeze.d.ts +4 -0
  64. package/dist/unfreeze.js +6 -0
  65. package/dist/utxo.d.ts +2 -0
  66. package/dist/utxo.js +2 -0
  67. package/package.json +24 -0
@@ -0,0 +1 @@
1
+ export declare const assertUnreachable: (x: never) => never;
@@ -0,0 +1,3 @@
1
+ export const assertUnreachable = (x) => {
2
+ throw Error(`unhandled case: ${x}`);
3
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,120 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { decodeAssetData } from './decodeAssetData';
3
+ import { encodeAssetData } from './encodeAssetData';
4
+ const mockGeneratedAssetData = {
5
+ 'bip122:000000000019d6689c085ae165831e93/slip44:0': {
6
+ assetId: 'bip122:000000000019d6689c085ae165831e93/slip44:0',
7
+ chainId: 'bip122:000000000019d6689c085ae165831e93',
8
+ symbol: 'BTC',
9
+ name: 'Bitcoin',
10
+ networkName: 'Bitcoin',
11
+ precision: 8,
12
+ color: '#FF9800',
13
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/b7a5f12d893fcf58e0eb1dd64478f076857b720b/blockchains/bitcoin/info/logo.png',
14
+ explorer: 'https://live.blockcypher.com',
15
+ explorerAddressLink: 'https://live.blockcypher.com/btc/address/',
16
+ explorerTxLink: 'https://live.blockcypher.com/btc/tx/',
17
+ relatedAssetKey: null,
18
+ },
19
+ 'eip155:1/erc20:0xf073bac22dab7faf4a3dd6c6189a70d54110525c': {
20
+ assetId: 'eip155:1/erc20:0xf073bac22dab7faf4a3dd6c6189a70d54110525c',
21
+ chainId: 'eip155:1',
22
+ name: 'Inception Restaked ETH on Ethereum',
23
+ precision: 18,
24
+ color: '#D6D1E4',
25
+ icon: 'https://assets.coingecko.com/coins/images/34127/large/inETH.png?1715036464',
26
+ symbol: 'INETH',
27
+ explorer: 'https://etherscan.io',
28
+ explorerAddressLink: 'https://etherscan.io/address/',
29
+ explorerTxLink: 'https://etherscan.io/tx/',
30
+ relatedAssetKey: 'eip155:1/erc20:0xf073bac22dab7faf4a3dd6c6189a70d54110525c',
31
+ },
32
+ 'eip155:1/erc20:0xeed3ae7b0f8b5b9bb8c035a9941382b1822671cd': {
33
+ assetId: 'eip155:1/erc20:0xeed3ae7b0f8b5b9bb8c035a9941382b1822671cd',
34
+ chainId: 'eip155:1',
35
+ name: 'EveryCoin',
36
+ precision: 12,
37
+ color: '#0483CB',
38
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/master/blockchains/ethereum/assets/0xEEd3aE7b0F8b5B9BB8C035A9941382B1822671CD/logo.png',
39
+ symbol: 'EVY',
40
+ explorer: 'https://etherscan.io',
41
+ explorerAddressLink: 'https://etherscan.io/address/',
42
+ explorerTxLink: 'https://etherscan.io/tx/',
43
+ relatedAssetKey: null,
44
+ },
45
+ 'eip155:1/erc20:0xeeda34a377dd0ca676b9511ee1324974fa8d980d': {
46
+ explorer: 'https://etherscan.io',
47
+ explorerAddressLink: 'https://etherscan.io/address/',
48
+ explorerTxLink: 'https://etherscan.io/tx/',
49
+ color: '#FFFFFF',
50
+ icon: undefined,
51
+ icons: [
52
+ 'https://rawcdn.githack.com/trustwallet/assets/master/blockchains/ethereum/assets/0xD9A442856C234a39a81a089C06451EBAa4306a72/logo.png',
53
+ 'https://rawcdn.githack.com/trustwallet/assets/master/blockchains/ethereum/assets/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0/logo.png',
54
+ ],
55
+ name: 'Curve PUFETH/WSTETH Pool',
56
+ precision: 18,
57
+ symbol: 'pufETHwstE',
58
+ chainId: 'eip155:1',
59
+ assetId: 'eip155:1/erc20:0xeeda34a377dd0ca676b9511ee1324974fa8d980d',
60
+ relatedAssetKey: null,
61
+ isPool: true,
62
+ },
63
+ 'eip155:1/erc20:0xeee0fe52299f2de8e2ed5111cd521ab67dcf0faf': {
64
+ assetId: 'eip155:1/erc20:0xeee0fe52299f2de8e2ed5111cd521ab67dcf0faf',
65
+ chainId: 'eip155:1',
66
+ name: 'The QWAN',
67
+ precision: 18,
68
+ color: '#18B6BE',
69
+ icon: 'https://assets.coingecko.com/coins/images/30613/large/qwan.jpg?1696529482',
70
+ symbol: 'QWAN',
71
+ explorer: 'https://etherscan.io',
72
+ explorerAddressLink: 'https://etherscan.io/address/',
73
+ explorerTxLink: 'https://etherscan.io/tx/',
74
+ relatedAssetKey: null,
75
+ },
76
+ 'eip155:1/erc20:0xeeecd285f60e802ecb6d8d8d37790c887f9a4b33': {
77
+ assetId: 'eip155:1/erc20:0xeeecd285f60e802ecb6d8d8d37790c887f9a4b33',
78
+ chainId: 'eip155:1',
79
+ name: 'Big Tom',
80
+ precision: 9,
81
+ color: '#27DD08',
82
+ icon: 'https://assets.coingecko.com/coins/images/38555/large/huyah_%281%29.jpg?1717999187',
83
+ symbol: 'TOM',
84
+ explorer: 'https://etherscan.io',
85
+ explorerAddressLink: 'https://etherscan.io/address/',
86
+ explorerTxLink: 'https://etherscan.io/tx/',
87
+ relatedAssetKey: null,
88
+ },
89
+ 'eip155:1/erc20:0xeeee2a2e650697d2a8e8bc990c2f3d04203be06f': {
90
+ assetId: 'eip155:1/erc20:0xeeee2a2e650697d2a8e8bc990c2f3d04203be06f',
91
+ chainId: 'eip155:1',
92
+ name: 'Forgotten Playland',
93
+ precision: 18,
94
+ color: '#35355D',
95
+ icon: 'https://assets.coingecko.com/coins/images/35339/large/200.png?1708515043',
96
+ symbol: 'FP',
97
+ explorer: 'https://etherscan.io',
98
+ explorerAddressLink: 'https://etherscan.io/address/',
99
+ explorerTxLink: 'https://etherscan.io/tx/',
100
+ relatedAssetKey: null,
101
+ },
102
+ };
103
+ // Order of these is deliberately shuffled to test sorting is preserved
104
+ const mockSortedAssetIds = [
105
+ 'eip155:1/erc20:0xeeecd285f60e802ecb6d8d8d37790c887f9a4b33',
106
+ 'eip155:1/erc20:0xeeee2a2e650697d2a8e8bc990c2f3d04203be06f',
107
+ 'eip155:1/erc20:0xeed3ae7b0f8b5b9bb8c035a9941382b1822671cd',
108
+ 'eip155:1/erc20:0xf073bac22dab7faf4a3dd6c6189a70d54110525c',
109
+ 'eip155:1/erc20:0xeee0fe52299f2de8e2ed5111cd521ab67dcf0faf',
110
+ 'eip155:1/erc20:0xeeda34a377dd0ca676b9511ee1324974fa8d980d',
111
+ 'bip122:000000000019d6689c085ae165831e93/slip44:0', // BTC
112
+ ];
113
+ describe('assetData', () => {
114
+ it('can encode and decode asset data as a complete round trip', () => {
115
+ const encodedAssetData = encodeAssetData(mockSortedAssetIds, mockGeneratedAssetData);
116
+ const { assetData, sortedAssetIds } = decodeAssetData(encodedAssetData);
117
+ expect(assetData).toEqual(mockGeneratedAssetData);
118
+ expect(sortedAssetIds).toEqual(mockSortedAssetIds);
119
+ });
120
+ });
@@ -0,0 +1,20 @@
1
+ import type { Asset } from '@shapeshiftoss/types';
2
+ export declare const ethereum: Readonly<Asset>;
3
+ export declare const bitcoin: Readonly<Asset>;
4
+ export declare const bitcoincash: Readonly<Asset>;
5
+ export declare const dogecoin: Readonly<Asset>;
6
+ export declare const litecoin: Readonly<Asset>;
7
+ export declare const atom: Readonly<Asset>;
8
+ export declare const avax: Readonly<Asset>;
9
+ export declare const thorchain: Readonly<Asset>;
10
+ export declare const tcy: Readonly<Asset>;
11
+ export declare const maya: Readonly<Asset>;
12
+ export declare const mayachain: Readonly<Asset>;
13
+ export declare const optimism: Readonly<Asset>;
14
+ export declare const bnbsmartchain: Readonly<Asset>;
15
+ export declare const polygon: Readonly<Asset>;
16
+ export declare const gnosis: Readonly<Asset>;
17
+ export declare const arbitrum: Readonly<Asset>;
18
+ export declare const arbitrumNova: Readonly<Asset>;
19
+ export declare const base: Readonly<Asset>;
20
+ export declare const solana: Readonly<Asset>;
@@ -0,0 +1,279 @@
1
+ import * as caip from '@shapeshiftoss/caip';
2
+ const mayaTokenAssetId = 'cosmos:mayachain-mainnet-v1/slip44:maya';
3
+ export const ethereum = Object.freeze({
4
+ assetId: caip.ethAssetId,
5
+ chainId: caip.ethChainId,
6
+ symbol: 'ETH',
7
+ name: 'Ethereum',
8
+ networkName: 'Ethereum',
9
+ precision: 18,
10
+ color: '#5C6BC0',
11
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png',
12
+ explorer: 'https://etherscan.io',
13
+ explorerAddressLink: 'https://etherscan.io/address/',
14
+ explorerTxLink: 'https://etherscan.io/tx/',
15
+ relatedAssetKey: 'eip155:1/slip44:60',
16
+ });
17
+ export const bitcoin = Object.freeze({
18
+ assetId: caip.btcAssetId,
19
+ chainId: caip.btcChainId,
20
+ symbol: 'BTC',
21
+ name: 'Bitcoin',
22
+ networkName: 'Bitcoin',
23
+ precision: 8,
24
+ color: '#FF9800',
25
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/b7a5f12d893fcf58e0eb1dd64478f076857b720b/blockchains/bitcoin/info/logo.png',
26
+ explorer: 'https://live.blockcypher.com',
27
+ explorerAddressLink: 'https://live.blockcypher.com/btc/address/',
28
+ explorerTxLink: 'https://live.blockcypher.com/btc/tx/',
29
+ relatedAssetKey: null,
30
+ });
31
+ export const bitcoincash = Object.freeze({
32
+ assetId: caip.bchAssetId,
33
+ chainId: caip.bchChainId,
34
+ symbol: 'BCH',
35
+ name: 'Bitcoin Cash',
36
+ networkName: 'Bitcoin Cash',
37
+ precision: 8,
38
+ color: '#8BC34A',
39
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/b7a5f12d893fcf58e0eb1dd64478f076857b720b/blockchains/bitcoincash/info/logo.png',
40
+ explorer: 'https://blockchair.com',
41
+ explorerAddressLink: 'https://blockchair.com/bitcoin-cash/address/',
42
+ explorerTxLink: 'https://blockchair.com/bitcoin-cash/transaction/',
43
+ relatedAssetKey: null,
44
+ });
45
+ export const dogecoin = Object.freeze({
46
+ assetId: caip.dogeAssetId,
47
+ chainId: caip.dogeChainId,
48
+ symbol: 'DOGE',
49
+ name: 'Dogecoin',
50
+ networkName: 'Dogecoin',
51
+ precision: 8,
52
+ color: '#FFC107',
53
+ icon: 'https://assets.coingecko.com/coins/images/5/large/dogecoin.png?1696501409',
54
+ explorer: 'https://live.blockcypher.com',
55
+ explorerAddressLink: 'https://live.blockcypher.com/doge/address/',
56
+ explorerTxLink: 'https://live.blockcypher.com/doge/tx/',
57
+ relatedAssetKey: null,
58
+ });
59
+ export const litecoin = Object.freeze({
60
+ assetId: caip.ltcAssetId,
61
+ chainId: caip.ltcChainId,
62
+ symbol: 'LTC',
63
+ name: 'Litecoin',
64
+ networkName: 'Litecoin',
65
+ precision: 8,
66
+ color: '#B8B8B8',
67
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/litecoin/info/logo.png',
68
+ explorer: 'https://live.blockcypher.com',
69
+ explorerAddressLink: 'https://live.blockcypher.com/ltc/address/',
70
+ explorerTxLink: 'https://live.blockcypher.com/ltc/tx/',
71
+ relatedAssetKey: null,
72
+ });
73
+ export const atom = Object.freeze({
74
+ assetId: caip.cosmosAssetId,
75
+ chainId: caip.cosmosChainId,
76
+ symbol: 'ATOM',
77
+ name: 'Cosmos',
78
+ networkName: 'Cosmos',
79
+ precision: 6,
80
+ color: '#303F9F',
81
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/b7a5f12d893fcf58e0eb1dd64478f076857b720b/blockchains/cosmos/info/logo.png',
82
+ explorer: 'https://www.mintscan.io/cosmos',
83
+ explorerAddressLink: 'https://www.mintscan.io/cosmos/account/',
84
+ explorerTxLink: 'https://www.mintscan.io/cosmos/txs/',
85
+ relatedAssetKey: null,
86
+ });
87
+ export const avax = Object.freeze({
88
+ assetId: caip.avalancheAssetId,
89
+ chainId: caip.avalancheChainId,
90
+ name: 'Avalanche',
91
+ networkName: 'Avalanche C-Chain',
92
+ symbol: 'AVAX',
93
+ precision: 18,
94
+ color: '#FFFFFF',
95
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/b7a5f12d893fcf58e0eb1dd64478f076857b720b/blockchains/avalanchec/info/logo.png',
96
+ explorer: 'https://snowtrace.dev',
97
+ explorerAddressLink: 'https://snowtrace.dev/address/',
98
+ explorerTxLink: 'https://snowtrace.dev/tx/',
99
+ relatedAssetKey: null,
100
+ });
101
+ export const thorchain = Object.freeze({
102
+ assetId: caip.thorchainAssetId,
103
+ chainId: caip.thorchainChainId,
104
+ name: 'THORChain',
105
+ networkName: 'THORChain',
106
+ symbol: 'RUNE',
107
+ precision: 8,
108
+ color: '#33FF99',
109
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/thorchain/info/logo.png',
110
+ explorer: 'https://viewblock.io/thorchain',
111
+ explorerAddressLink: 'https://viewblock.io/thorchain/address/',
112
+ explorerTxLink: 'https://viewblock.io/thorchain/tx/',
113
+ relatedAssetKey: null,
114
+ });
115
+ export const tcy = Object.freeze({
116
+ assetId: caip.tcyAssetId,
117
+ chainId: caip.thorchainChainId,
118
+ name: 'TCY',
119
+ networkName: 'THORChain',
120
+ symbol: 'TCY',
121
+ precision: 8,
122
+ color: '#33FF99',
123
+ icon: 'https://raw.githubusercontent.com/shapeshift/web/develop/scripts/generateAssetData/thorchain/icons/tcy-icon.png',
124
+ explorer: 'https://viewblock.io/thorchain',
125
+ explorerAddressLink: 'https://viewblock.io/thorchain/address/',
126
+ explorerTxLink: 'https://viewblock.io/thorchain/tx/',
127
+ relatedAssetKey: null,
128
+ });
129
+ export const maya = Object.freeze({
130
+ assetId: mayaTokenAssetId,
131
+ chainId: caip.mayachainChainId,
132
+ name: 'MAYA',
133
+ networkName: 'MAYAChain',
134
+ symbol: 'MAYA',
135
+ precision: 4,
136
+ color: '#00FFA0',
137
+ icon: 'https://raw.githubusercontent.com/shapeshift/web/develop/scripts/generateAssetData/thorchain/icons/maya.png',
138
+ explorer: 'https://mayascan.org',
139
+ explorerAddressLink: 'https://mayascan.org/address/',
140
+ explorerTxLink: 'https://mayascan.org/tx/',
141
+ relatedAssetKey: null,
142
+ });
143
+ export const mayachain = Object.freeze({
144
+ assetId: caip.mayachainAssetId,
145
+ chainId: caip.mayachainChainId,
146
+ name: 'MAYAChain',
147
+ networkName: 'MAYAChain',
148
+ symbol: 'CACAO',
149
+ precision: 10,
150
+ color: '#63FDD9',
151
+ icon: 'https://gitlab.com/mayachain/frontend/mayachain-explorer-v2/-/raw/main/assets/images/cacao.png',
152
+ networkIcon: 'https://gitlab.com/uploads/-/system/project/avatar/36018613/maya_logo.png',
153
+ explorer: 'https://mayascan.org',
154
+ explorerAddressLink: 'https://mayascan.org/address/',
155
+ explorerTxLink: 'https://mayascan.org/tx/',
156
+ relatedAssetKey: null,
157
+ });
158
+ export const optimism = Object.freeze({
159
+ assetId: caip.optimismAssetId,
160
+ chainId: caip.optimismChainId,
161
+ name: 'Ethereum',
162
+ networkName: 'Optimism',
163
+ symbol: 'ETH',
164
+ precision: 18,
165
+ color: '#5C6BC0',
166
+ networkColor: '#FC0424',
167
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png',
168
+ networkIcon: 'https://assets.coingecko.com/coins/images/25244/large/Optimism.png?1660904599',
169
+ explorer: 'https://optimistic.etherscan.io',
170
+ explorerAddressLink: 'https://optimistic.etherscan.io/address/',
171
+ explorerTxLink: 'https://optimistic.etherscan.io/tx/',
172
+ relatedAssetKey: 'eip155:1/slip44:60',
173
+ });
174
+ export const bnbsmartchain = Object.freeze({
175
+ assetId: caip.bscAssetId,
176
+ chainId: caip.bscChainId,
177
+ name: 'BNB',
178
+ networkName: 'BNB Smart Chain',
179
+ symbol: 'BNB',
180
+ precision: 18,
181
+ color: '#F0B90B',
182
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/b7a5f12d893fcf58e0eb1dd64478f076857b720b/blockchains/binance/info/logo.png',
183
+ explorer: 'https://bscscan.com',
184
+ explorerAddressLink: 'https://bscscan.com/address/',
185
+ explorerTxLink: 'https://bscscan.com/tx/',
186
+ relatedAssetKey: null,
187
+ });
188
+ export const polygon = Object.freeze({
189
+ assetId: caip.polygonAssetId,
190
+ chainId: caip.polygonChainId,
191
+ name: 'Polygon Ecosystem Token',
192
+ networkName: 'Polygon',
193
+ symbol: 'POL',
194
+ precision: 18,
195
+ color: '#8f00ff',
196
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/b7a5f12d893fcf58e0eb1dd64478f076857b720b/blockchains/polygon/info/logo.png',
197
+ explorer: 'https://polygonscan.com/',
198
+ explorerAddressLink: 'https://polygonscan.com/address/',
199
+ explorerTxLink: 'https://polygonscan.com/tx/',
200
+ relatedAssetKey: null,
201
+ });
202
+ export const gnosis = Object.freeze({
203
+ assetId: caip.gnosisAssetId,
204
+ chainId: caip.gnosisChainId,
205
+ name: 'xDAI',
206
+ networkName: 'Gnosis',
207
+ symbol: 'xDAI',
208
+ precision: 18,
209
+ color: '#33765c',
210
+ icon: 'https://assets.coingecko.com/coins/images/11062/large/Identity-Primary-DarkBG.png?1638372986',
211
+ networkIcon: 'https://assets.coingecko.com/asset_platforms/images/11062/large/Aatar_green_white.png?1643204471',
212
+ explorer: 'https://gnosis.blockscout.com/',
213
+ explorerAddressLink: 'https://gnosis.blockscout.com/address/',
214
+ explorerTxLink: 'https://gnosis.blockscout.com/tx/',
215
+ relatedAssetKey: null,
216
+ });
217
+ export const arbitrum = Object.freeze({
218
+ assetId: caip.arbitrumAssetId,
219
+ chainId: caip.arbitrumChainId,
220
+ name: 'Ethereum',
221
+ networkName: 'Arbitrum One',
222
+ symbol: 'ETH',
223
+ precision: 18,
224
+ color: '#5C6BC0',
225
+ networkColor: '#213147',
226
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png',
227
+ networkIcon: 'https://raw.githubusercontent.com/trustwallet/assets/b7a5f12d893fcf58e0eb1dd64478f076857b720b/blockchains/arbitrum/info/logo.png',
228
+ explorer: 'https://arbiscan.io',
229
+ explorerAddressLink: 'https://arbiscan.io/address/',
230
+ explorerTxLink: 'https://arbiscan.io/tx/',
231
+ relatedAssetKey: 'eip155:1/slip44:60',
232
+ });
233
+ export const arbitrumNova = Object.freeze({
234
+ assetId: caip.arbitrumNovaAssetId,
235
+ chainId: caip.arbitrumNovaChainId,
236
+ name: 'Ethereum',
237
+ networkName: 'Arbitrum Nova',
238
+ symbol: 'ETH',
239
+ precision: 18,
240
+ color: '#5C6BC0',
241
+ networkColor: '#E67408',
242
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png',
243
+ networkIcon: 'https://assets.coingecko.com/asset_platforms/images/93/large/AN_logomark.png?1695026131',
244
+ explorer: 'https://nova.arbiscan.io',
245
+ explorerAddressLink: 'https://nova.arbiscan.io/address/',
246
+ explorerTxLink: 'https://nova.arbiscan.io/tx/',
247
+ relatedAssetKey: 'eip155:1/slip44:60',
248
+ });
249
+ export const base = Object.freeze({
250
+ assetId: caip.baseAssetId,
251
+ chainId: caip.baseChainId,
252
+ name: 'Ethereum',
253
+ networkName: 'Base',
254
+ symbol: 'ETH',
255
+ precision: 18,
256
+ color: '#5C6BC0',
257
+ networkColor: '#0052FF',
258
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png',
259
+ networkIcon: 'https://rawcdn.githack.com/base-org/brand-kit/8984fe6e08be3058fd7cf5cd0b201f8b92b5a70e/logo/symbol/Base_Symbol_Blue.png',
260
+ explorer: 'https://basescan.org',
261
+ explorerAddressLink: 'https://basescan.org/address/',
262
+ explorerTxLink: 'https://basescan.org/tx/',
263
+ relatedAssetKey: 'eip155:1/slip44:60',
264
+ });
265
+ export const solana = Object.freeze({
266
+ assetId: caip.solAssetId,
267
+ chainId: caip.solanaChainId,
268
+ name: 'Solana',
269
+ networkName: 'Solana',
270
+ symbol: 'SOL',
271
+ precision: 9,
272
+ color: '#9971d8',
273
+ networkColor: '#9971d8',
274
+ icon: 'https://rawcdn.githack.com/trustwallet/assets/426526def2f327476e868ecb902c515ab17518af/blockchains/solana/info/logo.png',
275
+ explorer: 'https://explorer.solana.com',
276
+ explorerAddressLink: 'https://explorer.solana.com/address/',
277
+ explorerTxLink: 'https://explorer.solana.com/tx/',
278
+ relatedAssetKey: null,
279
+ });
@@ -0,0 +1 @@
1
+ export declare const FIELDS: readonly ["assetIdx", "name", "precision", "color", "icon", "symbol", "relatedAssetKey", "isPool"];
@@ -0,0 +1,10 @@
1
+ export const FIELDS = [
2
+ 'assetIdx',
3
+ 'name',
4
+ 'precision',
5
+ 'color',
6
+ 'icon',
7
+ 'symbol',
8
+ 'relatedAssetKey',
9
+ 'isPool',
10
+ ];
@@ -0,0 +1,7 @@
1
+ import type { AssetId } from '@shapeshiftoss/caip';
2
+ import type { Asset } from '@shapeshiftoss/types';
3
+ import type { EncodedAssetData } from './types';
4
+ export declare const decodeAssetData: (encodedAssetData: EncodedAssetData) => {
5
+ assetData: Record<AssetId, Asset>;
6
+ sortedAssetIds: AssetId[];
7
+ };
@@ -0,0 +1,94 @@
1
+ import { fromAssetId } from '@shapeshiftoss/caip';
2
+ import { pick } from 'lodash';
3
+ import { assertUnreachable } from '../assertUnreachable';
4
+ import { FIELDS } from './constants';
5
+ import { getBaseAsset } from './getBaseAsset';
6
+ const decodeAssetId = (encodedAssetId, assetIdPrefixes) => {
7
+ // Performance sensitive. `lastIndexOf` + `substring` faster than `split`
8
+ const colonIndex = encodedAssetId.lastIndexOf(':');
9
+ const prefixIdx = Number(encodedAssetId.substring(0, colonIndex));
10
+ const assetReference = encodedAssetId.substring(colonIndex + 1);
11
+ // Performance sensitive. String concatenation faster than template literal
12
+ return assetIdPrefixes[prefixIdx] + ':' + assetReference;
13
+ };
14
+ export const decodeAssetData = (encodedAssetData) => {
15
+ const { assetIdPrefixes, encodedAssetIds, encodedAssets } = encodedAssetData;
16
+ const sortedAssetIds = encodedAssetIds.map(encodedAssetId => decodeAssetId(encodedAssetId, assetIdPrefixes));
17
+ const assetData = encodedAssets.reduce((acc, encodedAsset, idx) => {
18
+ const assetId = sortedAssetIds[idx];
19
+ const { chainId } = fromAssetId(assetId);
20
+ const baseAsset = getBaseAsset(chainId);
21
+ // Initialize with default values for the chain
22
+ const asset = Object.assign({
23
+ assetId,
24
+ chainId,
25
+ symbol: '',
26
+ name: '',
27
+ precision: 0,
28
+ color: '',
29
+ icon: undefined,
30
+ explorer: '',
31
+ explorerAddressLink: '',
32
+ explorerTxLink: '',
33
+ relatedAssetKey: null,
34
+ }, pick(baseAsset, ['explorer', 'explorerAddressLink', 'explorerTxLink']));
35
+ if (assetId === baseAsset?.assetId) {
36
+ asset.networkName = baseAsset.networkName;
37
+ asset.networkIcon = baseAsset.networkIcon;
38
+ asset.networkColor = baseAsset.networkColor;
39
+ }
40
+ // Apply each field's decoded value to the asset
41
+ FIELDS.forEach((field, fieldIdx) => {
42
+ const value = encodedAsset[fieldIdx];
43
+ switch (field) {
44
+ case 'icon': {
45
+ const iconOrIcons = value;
46
+ if (iconOrIcons.length === 1) {
47
+ asset.icon = iconOrIcons[0];
48
+ }
49
+ else if (iconOrIcons.length > 1) {
50
+ asset.icons = iconOrIcons;
51
+ }
52
+ break;
53
+ }
54
+ case 'relatedAssetKey': {
55
+ const assetIdx = value;
56
+ const relatedAssetId = assetIdx === null ? null : sortedAssetIds[assetIdx];
57
+ // if (relatedAssetId === undefined) throw Error()
58
+ asset.relatedAssetKey = relatedAssetId;
59
+ break;
60
+ }
61
+ case 'name':
62
+ asset.name = value;
63
+ break;
64
+ case 'precision':
65
+ asset.precision = value;
66
+ break;
67
+ case 'color':
68
+ asset.color = value;
69
+ break;
70
+ case 'symbol':
71
+ asset.symbol = value;
72
+ break;
73
+ case 'isPool': {
74
+ const isPool = value;
75
+ if (isPool) {
76
+ asset.isPool = true;
77
+ }
78
+ break;
79
+ }
80
+ case 'assetIdx':
81
+ // Skip assetIdx as we already have assetId
82
+ break;
83
+ default:
84
+ assertUnreachable(field);
85
+ }
86
+ });
87
+ acc[assetId] = asset;
88
+ return acc;
89
+ }, {});
90
+ return {
91
+ assetData,
92
+ sortedAssetIds,
93
+ };
94
+ };
@@ -0,0 +1,3 @@
1
+ import type { AssetId } from '@shapeshiftoss/caip';
2
+ import type { EncodedRelatedAssetIndex } from './types';
3
+ export declare const decodeRelatedAssetIndex: (encodedRelatedAssetIndex: EncodedRelatedAssetIndex, sortedAssetIds: AssetId[]) => Record<AssetId, AssetId[]>;
@@ -0,0 +1,10 @@
1
+ export const decodeRelatedAssetIndex = (encodedRelatedAssetIndex, sortedAssetIds) => {
2
+ const result = {};
3
+ for (let assetIdx = 0; assetIdx < sortedAssetIds.length; assetIdx++) {
4
+ const assetId = sortedAssetIds[assetIdx];
5
+ if (!encodedRelatedAssetIndex[assetIdx])
6
+ continue;
7
+ result[assetId] = encodedRelatedAssetIndex[assetIdx].map(innerAssetIdx => sortedAssetIds[innerAssetIdx]);
8
+ }
9
+ return result;
10
+ };
@@ -0,0 +1,4 @@
1
+ import type { AssetId } from '@shapeshiftoss/caip';
2
+ import type { AssetsById } from '@shapeshiftoss/types';
3
+ import type { EncodedAssetData } from './types';
4
+ export declare const encodeAssetData: (sortedAssetIds: AssetId[], assetsById: AssetsById) => EncodedAssetData;
@@ -0,0 +1,68 @@
1
+ import { assertUnreachable } from '../assertUnreachable';
2
+ import { FIELDS } from './constants';
3
+ const encodeAssetIds = (sortedAssetIds) => {
4
+ const assetIdPrefixes = [];
5
+ const encodedAssetIds = [];
6
+ for (const assetId of sortedAssetIds) {
7
+ // `indexOf` + `substring` faster than `split`
8
+ const colonIndex = assetId.lastIndexOf(':');
9
+ const prefix = assetId.substring(0, colonIndex);
10
+ const assetReference = assetId.substring(colonIndex + 1);
11
+ const prefixIdx = (() => {
12
+ const prefixIdx = assetIdPrefixes.indexOf(prefix);
13
+ if (prefixIdx !== -1) {
14
+ return prefixIdx;
15
+ }
16
+ else {
17
+ assetIdPrefixes.push(prefix);
18
+ return assetIdPrefixes.length - 1;
19
+ }
20
+ })();
21
+ encodedAssetIds.push(`${prefixIdx}:${assetReference}`);
22
+ }
23
+ return {
24
+ assetIdPrefixes,
25
+ encodedAssetIds,
26
+ };
27
+ };
28
+ const encodeField = (field, assetIdToAssetIdx, asset) => {
29
+ switch (field) {
30
+ case 'assetIdx':
31
+ return assetIdToAssetIdx[asset.assetId];
32
+ case 'name':
33
+ return asset.name;
34
+ case 'precision':
35
+ return asset.precision;
36
+ case 'color':
37
+ return asset.color;
38
+ case 'icon':
39
+ return (asset.icon ? [asset.icon] : asset.icons ?? []);
40
+ case 'symbol':
41
+ return asset.symbol;
42
+ case 'relatedAssetKey':
43
+ return (!asset.relatedAssetKey ? null : assetIdToAssetIdx[asset.relatedAssetKey]);
44
+ case 'isPool':
45
+ return (asset.isPool ? 1 : 0);
46
+ default:
47
+ return assertUnreachable(field);
48
+ }
49
+ };
50
+ export const encodeAssetData = (sortedAssetIds, assetsById) => {
51
+ const { assetIdPrefixes, encodedAssetIds } = encodeAssetIds(sortedAssetIds);
52
+ const assetIdToAssetIdx = sortedAssetIds.reduce((acc, val, idx) => {
53
+ acc[val] = idx;
54
+ return acc;
55
+ }, {});
56
+ const encodedAssets = [];
57
+ for (let i = 0; i < encodedAssetIds.length; i++) {
58
+ const assetId = sortedAssetIds[i];
59
+ const asset = assetsById[assetId];
60
+ const record = FIELDS.map(field => encodeField(field, assetIdToAssetIdx, asset));
61
+ encodedAssets.push(record);
62
+ }
63
+ return {
64
+ assetIdPrefixes,
65
+ encodedAssetIds,
66
+ encodedAssets,
67
+ };
68
+ };
@@ -0,0 +1,3 @@
1
+ import type { AssetId } from '@shapeshiftoss/caip';
2
+ import type { EncodedRelatedAssetIndex } from './types';
3
+ export declare const encodeRelatedAssetIndex: (relatedAssetIndex: Record<AssetId, AssetId[]>, sortedAssetIds: AssetId[]) => EncodedRelatedAssetIndex;
@@ -0,0 +1,16 @@
1
+ export const encodeRelatedAssetIndex = (relatedAssetIndex, sortedAssetIds) => {
2
+ const assetIdToAssetIdx = sortedAssetIds.reduce((acc, val, idx) => {
3
+ acc[val] = idx;
4
+ return acc;
5
+ }, {});
6
+ const result = {};
7
+ for (const [assetId, relatedAssets] of Object.entries(relatedAssetIndex)) {
8
+ if (!relatedAssets.length)
9
+ continue;
10
+ const assetIdx = assetIdToAssetIdx[assetId];
11
+ result[assetIdx] = relatedAssets.map(assetId => {
12
+ return assetIdToAssetIdx[assetId];
13
+ });
14
+ }
15
+ return result;
16
+ };