sushi 6.6.7 → 6.6.9
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/_cjs/evm/config/subgraphs/subgraphs/sushiswap-v2.js +2 -7
- package/_cjs/evm/config/subgraphs/subgraphs/sushiswap-v2.js.map +1 -1
- package/_cjs/evm/config/subgraphs/subgraphs/sushiswap-v3.js +2 -7
- package/_cjs/evm/config/subgraphs/subgraphs/sushiswap-v3.js.map +1 -1
- package/_cjs/generic/currency/for-chain.js +66 -0
- package/_cjs/generic/currency/for-chain.js.map +1 -0
- package/_cjs/generic/currency/index.js +1 -0
- package/_cjs/generic/currency/index.js.map +1 -1
- package/_esm/evm/config/subgraphs/subgraphs/sushiswap-v2.js +2 -7
- package/_esm/evm/config/subgraphs/subgraphs/sushiswap-v2.js.map +1 -1
- package/_esm/evm/config/subgraphs/subgraphs/sushiswap-v3.js +2 -7
- package/_esm/evm/config/subgraphs/subgraphs/sushiswap-v3.js.map +1 -1
- package/_esm/generic/currency/for-chain.js +62 -0
- package/_esm/generic/currency/for-chain.js.map +1 -0
- package/_esm/generic/currency/index.js +1 -0
- package/_esm/generic/currency/index.js.map +1 -1
- package/_types/evm/config/subgraphs/subgraphs/sushiswap-v2.d.ts +1 -1
- package/_types/evm/config/subgraphs/subgraphs/sushiswap-v2.d.ts.map +1 -1
- package/_types/evm/config/subgraphs/subgraphs/sushiswap-v3.d.ts +1 -1
- package/_types/evm/config/subgraphs/subgraphs/sushiswap-v3.d.ts.map +1 -1
- package/_types/evm/currency/currency.d.ts +1 -1
- package/_types/evm/currency/currency.d.ts.map +1 -1
- package/_types/generic/currency/currency.d.ts +1 -1
- package/_types/generic/currency/currency.d.ts.map +1 -1
- package/_types/generic/currency/for-chain.d.ts +33 -0
- package/_types/generic/currency/for-chain.d.ts.map +1 -0
- package/_types/generic/currency/index.d.ts +1 -0
- package/_types/generic/currency/index.d.ts.map +1 -1
- package/_types/generic/types/for-chain.d.ts +4 -0
- package/_types/generic/types/for-chain.d.ts.map +1 -1
- package/_types/svm/currency/currency.d.ts +1 -1
- package/_types/svm/currency/currency.d.ts.map +1 -1
- package/evm/config/subgraphs/subgraphs/sushiswap-v2.ts +5 -8
- package/evm/config/subgraphs/subgraphs/sushiswap-v3.ts +5 -8
- package/evm/currency/currency.ts +1 -1
- package/generic/currency/currency.test-d.ts +41 -0
- package/generic/currency/currency.ts +1 -1
- package/generic/currency/for-chain.test-d.ts +248 -0
- package/generic/currency/for-chain.test.ts +108 -0
- package/generic/currency/for-chain.ts +152 -0
- package/generic/currency/index.ts +1 -0
- package/generic/types/for-chain.test-d.ts +112 -1
- package/generic/types/for-chain.ts +13 -0
- package/package.json +1 -1
- package/svm/currency/currency.ts +1 -1
|
@@ -16,6 +16,7 @@ import { MvmToken } from '../../mvm/currency/token.js'
|
|
|
16
16
|
import {
|
|
17
17
|
type SvmAddress,
|
|
18
18
|
type SvmChainId,
|
|
19
|
+
type SvmCurrency,
|
|
19
20
|
SvmNative,
|
|
20
21
|
SvmToken,
|
|
21
22
|
} from '../../svm/index.js'
|
|
@@ -199,6 +200,46 @@ describe('generic/currency/currency.ts types', () => {
|
|
|
199
200
|
})
|
|
200
201
|
})
|
|
201
202
|
|
|
203
|
+
describe('metadata generics', () => {
|
|
204
|
+
type Metadata = {
|
|
205
|
+
coingeckoId: string
|
|
206
|
+
verified: boolean
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
it('should preserve metadata on generic currency variants', () => {
|
|
210
|
+
const mockCurrency = {} as Currency<EvmChainId, Metadata>
|
|
211
|
+
|
|
212
|
+
expectTypeOf(mockCurrency)
|
|
213
|
+
.extract<{ isNative: true }>()
|
|
214
|
+
.toEqualTypeOf<Native<EvmChainId, Metadata>>()
|
|
215
|
+
expectTypeOf(mockCurrency)
|
|
216
|
+
.extract<{ isToken: true }>()
|
|
217
|
+
.toEqualTypeOf<Token<EvmChainId, string, Metadata>>()
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
it('should preserve metadata on EVM currency variants', () => {
|
|
221
|
+
const mockCurrency = {} as EvmCurrency<Metadata>
|
|
222
|
+
|
|
223
|
+
expectTypeOf(mockCurrency)
|
|
224
|
+
.extract<{ isNative: true }>()
|
|
225
|
+
.toEqualTypeOf<EvmNative<Metadata>>()
|
|
226
|
+
expectTypeOf(mockCurrency)
|
|
227
|
+
.extract<{ isToken: true }>()
|
|
228
|
+
.toEqualTypeOf<EvmToken<Metadata>>()
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
it('should preserve metadata on SVM currency variants', () => {
|
|
232
|
+
const mockCurrency = {} as SvmCurrency<Metadata>
|
|
233
|
+
|
|
234
|
+
expectTypeOf(mockCurrency)
|
|
235
|
+
.extract<{ isNative: true }>()
|
|
236
|
+
.toEqualTypeOf<SvmNative<Metadata>>()
|
|
237
|
+
expectTypeOf(mockCurrency)
|
|
238
|
+
.extract<{ isToken: true }>()
|
|
239
|
+
.toEqualTypeOf<SvmToken<Metadata>>()
|
|
240
|
+
})
|
|
241
|
+
})
|
|
242
|
+
|
|
202
243
|
describe('currency type extension', () => {
|
|
203
244
|
type CustomAddress = `${EvmAddress}-${EvmAddress}`
|
|
204
245
|
type SerializedCustomToken = {
|
|
@@ -69,4 +69,4 @@ export abstract class BaseCurrency<
|
|
|
69
69
|
export type Currency<
|
|
70
70
|
TChainId extends ChainId = ChainId,
|
|
71
71
|
TMetadata extends CurrencyMetadata = Record<string, unknown>,
|
|
72
|
-
> = Native<TChainId> | Token<TChainId, string, TMetadata>
|
|
72
|
+
> = Native<TChainId, TMetadata> | Token<TChainId, string, TMetadata>
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { describe, expectTypeOf, it } from 'vitest'
|
|
2
|
+
import { EvmChainId } from '../../evm/chain/chains.js'
|
|
3
|
+
import type { EvmNative } from '../../evm/currency/native.js'
|
|
4
|
+
import type {
|
|
5
|
+
EvmAddress,
|
|
6
|
+
EvmToken,
|
|
7
|
+
EvmTokenOrigin,
|
|
8
|
+
} from '../../evm/currency/token.js'
|
|
9
|
+
import { MvmChainId } from '../../mvm/chain/chains.js'
|
|
10
|
+
import type { MvmAddress, MvmToken } from '../../mvm/currency/token.js'
|
|
11
|
+
import type { StellarContractAddress } from '../../stellar/address.js'
|
|
12
|
+
import { StellarChainId } from '../../stellar/chain/chains.js'
|
|
13
|
+
import type { StellarToken } from '../../stellar/currency/token.js'
|
|
14
|
+
import { SvmChainId } from '../../svm/chain/chains.js'
|
|
15
|
+
import type { SvmNative } from '../../svm/currency/native.js'
|
|
16
|
+
import {
|
|
17
|
+
type SvmAddress,
|
|
18
|
+
type SvmToken,
|
|
19
|
+
svmAddress,
|
|
20
|
+
} from '../../svm/currency/token.js'
|
|
21
|
+
import type { AddressFor, NativeChainId, TokenFor } from '../types/for-chain.js'
|
|
22
|
+
import {
|
|
23
|
+
getNativeFor,
|
|
24
|
+
getTokenFor,
|
|
25
|
+
type TokenConstructorDataFor,
|
|
26
|
+
} from './for-chain.js'
|
|
27
|
+
|
|
28
|
+
describe('generic/currency/for-chain.ts types', () => {
|
|
29
|
+
type Metadata = {
|
|
30
|
+
coingeckoId: string
|
|
31
|
+
verified: boolean
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe('getNativeFor', () => {
|
|
35
|
+
it('returns the native currency class for each supported native chain family', () => {
|
|
36
|
+
const metadata: Metadata = { coingeckoId: 'ethereum', verified: true }
|
|
37
|
+
|
|
38
|
+
expectTypeOf(getNativeFor(EvmChainId.ETHEREUM, metadata)).toEqualTypeOf<
|
|
39
|
+
EvmNative<Metadata>
|
|
40
|
+
>()
|
|
41
|
+
expectTypeOf(getNativeFor(SvmChainId.SOLANA, metadata)).toEqualTypeOf<
|
|
42
|
+
SvmNative<Metadata>
|
|
43
|
+
>()
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('returns a native union for native chain id unions', () => {
|
|
47
|
+
const chainId = {} as NativeChainId
|
|
48
|
+
const metadata: Metadata = { coingeckoId: 'native', verified: true }
|
|
49
|
+
|
|
50
|
+
expectTypeOf(getNativeFor(chainId, metadata)).toEqualTypeOf<
|
|
51
|
+
EvmNative<Metadata> | SvmNative<Metadata>
|
|
52
|
+
>()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('rejects chain families without native currency classes', () => {
|
|
56
|
+
// @ts-expect-error MVM currently models currencies as tokens only.
|
|
57
|
+
getNativeFor(MvmChainId.APTOS, {})
|
|
58
|
+
|
|
59
|
+
// @ts-expect-error Stellar currently models currencies as tokens only.
|
|
60
|
+
getNativeFor(StellarChainId.STELLAR, {})
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
describe('TokenConstructorDataFor', () => {
|
|
65
|
+
it('matches EVM token constructor data without chainId', () => {
|
|
66
|
+
expectTypeOf<
|
|
67
|
+
TokenConstructorDataFor<EvmChainId, Metadata>
|
|
68
|
+
>().toMatchTypeOf<{
|
|
69
|
+
chainId?: EvmChainId
|
|
70
|
+
address: EvmAddress
|
|
71
|
+
symbol: string
|
|
72
|
+
name: string
|
|
73
|
+
decimals: number
|
|
74
|
+
metadata?: Metadata
|
|
75
|
+
origin?: EvmTokenOrigin | undefined
|
|
76
|
+
}>()
|
|
77
|
+
|
|
78
|
+
const data = {
|
|
79
|
+
address: '0x1234567890abcdef1234567890abcdef12345678',
|
|
80
|
+
symbol: 'TEST',
|
|
81
|
+
name: 'Test Token',
|
|
82
|
+
decimals: 18,
|
|
83
|
+
metadata: { coingeckoId: 'test-token', verified: true },
|
|
84
|
+
} satisfies TokenConstructorDataFor<EvmChainId, Metadata>
|
|
85
|
+
|
|
86
|
+
expectTypeOf(data.metadata).toMatchTypeOf<Metadata>()
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('matches MVM token constructor data without EVM/SVM/Stellar-only fields', () => {
|
|
90
|
+
const data = {
|
|
91
|
+
address: '0x1::aptos_coin::AptosCoin',
|
|
92
|
+
symbol: 'APT',
|
|
93
|
+
name: 'Aptos Coin',
|
|
94
|
+
decimals: 8,
|
|
95
|
+
} satisfies TokenConstructorDataFor<MvmChainId>
|
|
96
|
+
|
|
97
|
+
expectTypeOf(data.address).toMatchTypeOf<MvmAddress>()
|
|
98
|
+
|
|
99
|
+
const dataWithOrigin = {
|
|
100
|
+
address: '0x1::aptos_coin::AptosCoin',
|
|
101
|
+
symbol: 'APT',
|
|
102
|
+
name: 'Aptos Coin',
|
|
103
|
+
decimals: 8,
|
|
104
|
+
// @ts-expect-error origin is not part of MVM token constructor data.
|
|
105
|
+
origin: 'native',
|
|
106
|
+
} satisfies TokenConstructorDataFor<MvmChainId>
|
|
107
|
+
|
|
108
|
+
void dataWithOrigin
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('matches SVM token constructor data and preserves branded addresses', () => {
|
|
112
|
+
const data = {
|
|
113
|
+
address: svmAddress('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
|
|
114
|
+
symbol: 'USDC',
|
|
115
|
+
name: 'USD Coin',
|
|
116
|
+
decimals: 6,
|
|
117
|
+
metadata: { coingeckoId: 'usd-coin', verified: true },
|
|
118
|
+
} satisfies TokenConstructorDataFor<SvmChainId, Metadata>
|
|
119
|
+
|
|
120
|
+
expectTypeOf(data.address).toMatchTypeOf<SvmAddress>()
|
|
121
|
+
expectTypeOf(data.metadata).toMatchTypeOf<Metadata>()
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
it('matches Stellar token constructor data including issuer and origin', () => {
|
|
125
|
+
const data = {
|
|
126
|
+
address: 'CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA',
|
|
127
|
+
issuer: 'GDMTVHLWJTHSUDMZVVMXXH6VJHA2ZV3HNG5LYNAZ6RTWB7GISM6PGTUV',
|
|
128
|
+
symbol: 'XLM',
|
|
129
|
+
name: 'XLM',
|
|
130
|
+
decimals: 7,
|
|
131
|
+
origin: 'stellar.org',
|
|
132
|
+
} satisfies TokenConstructorDataFor<StellarChainId>
|
|
133
|
+
|
|
134
|
+
expectTypeOf(data.address).toMatchTypeOf<StellarContractAddress>()
|
|
135
|
+
expectTypeOf(data.origin).toMatchTypeOf<string>()
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
it('accepts chainId for compatibility', () => {
|
|
139
|
+
const dataWithChainId = {
|
|
140
|
+
address: '0x1234567890abcdef1234567890abcdef12345678',
|
|
141
|
+
symbol: 'TEST',
|
|
142
|
+
name: 'Test Token',
|
|
143
|
+
decimals: 18,
|
|
144
|
+
chainId: EvmChainId.ETHEREUM,
|
|
145
|
+
} satisfies TokenConstructorDataFor<EvmChainId>
|
|
146
|
+
|
|
147
|
+
void dataWithChainId
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
describe('getTokenFor', () => {
|
|
152
|
+
it('returns the token class selected by the chain id', () => {
|
|
153
|
+
expectTypeOf(
|
|
154
|
+
getTokenFor(EvmChainId.ETHEREUM, {
|
|
155
|
+
chainId: EvmChainId.POLYGON,
|
|
156
|
+
address: '0x1234567890abcdef1234567890abcdef12345678',
|
|
157
|
+
symbol: 'TEST',
|
|
158
|
+
name: 'Test Token',
|
|
159
|
+
decimals: 18,
|
|
160
|
+
metadata: { coingeckoId: 'test-token', verified: true },
|
|
161
|
+
}),
|
|
162
|
+
).toEqualTypeOf<EvmToken<Metadata>>()
|
|
163
|
+
|
|
164
|
+
expectTypeOf(
|
|
165
|
+
getTokenFor(MvmChainId.APTOS, {
|
|
166
|
+
address: '0x1::aptos_coin::AptosCoin',
|
|
167
|
+
symbol: 'APT',
|
|
168
|
+
name: 'Aptos Coin',
|
|
169
|
+
decimals: 8,
|
|
170
|
+
}),
|
|
171
|
+
).toEqualTypeOf<MvmToken<Record<string, unknown>>>()
|
|
172
|
+
|
|
173
|
+
expectTypeOf(
|
|
174
|
+
getTokenFor(SvmChainId.SOLANA, {
|
|
175
|
+
address: svmAddress('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
|
|
176
|
+
symbol: 'USDC',
|
|
177
|
+
name: 'USD Coin',
|
|
178
|
+
decimals: 6,
|
|
179
|
+
metadata: { coingeckoId: 'usd-coin', verified: true },
|
|
180
|
+
}),
|
|
181
|
+
).toEqualTypeOf<SvmToken<Metadata>>()
|
|
182
|
+
|
|
183
|
+
expectTypeOf(
|
|
184
|
+
getTokenFor(StellarChainId.STELLAR, {
|
|
185
|
+
address: 'CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA',
|
|
186
|
+
symbol: 'XLM',
|
|
187
|
+
name: 'XLM',
|
|
188
|
+
decimals: 7,
|
|
189
|
+
}),
|
|
190
|
+
).toEqualTypeOf<StellarToken<Record<string, unknown>>>()
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
it('returns a token union for generic chain id unions', () => {
|
|
194
|
+
const chainId = {} as EvmChainId | SvmChainId
|
|
195
|
+
const data = {} as TokenConstructorDataFor<
|
|
196
|
+
EvmChainId | SvmChainId,
|
|
197
|
+
Metadata
|
|
198
|
+
>
|
|
199
|
+
|
|
200
|
+
expectTypeOf(getTokenFor(chainId, data)).toEqualTypeOf<
|
|
201
|
+
EvmToken<Metadata> | SvmToken<Metadata>
|
|
202
|
+
>()
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
it('accepts generic EVM/SVM token input with address derived from the chain id', () => {
|
|
206
|
+
type GenericTokenInput<TChainId extends EvmChainId | SvmChainId> = {
|
|
207
|
+
address: AddressFor<TChainId>
|
|
208
|
+
symbol: string
|
|
209
|
+
name: string
|
|
210
|
+
decimals: number
|
|
211
|
+
metadata: Metadata
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function getGenericTokenFor<TChainId extends EvmChainId | SvmChainId>(
|
|
215
|
+
chainId: TChainId,
|
|
216
|
+
input: GenericTokenInput<TChainId>,
|
|
217
|
+
) {
|
|
218
|
+
return getTokenFor(chainId, input)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const chainId = {} as EvmChainId | SvmChainId
|
|
222
|
+
const input = {} as GenericTokenInput<typeof chainId>
|
|
223
|
+
|
|
224
|
+
expectTypeOf(getGenericTokenFor(chainId, input)).toEqualTypeOf<
|
|
225
|
+
TokenFor<EvmChainId | SvmChainId, Metadata>
|
|
226
|
+
>()
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
it('rejects constructor data for a different chain family', () => {
|
|
230
|
+
getTokenFor(SvmChainId.SOLANA, {
|
|
231
|
+
// @ts-expect-error SVM token data requires an SVM address.
|
|
232
|
+
address: '0x1234567890abcdef1234567890abcdef12345678',
|
|
233
|
+
symbol: 'TEST',
|
|
234
|
+
name: 'Test Token',
|
|
235
|
+
decimals: 18,
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
getTokenFor(MvmChainId.APTOS, {
|
|
239
|
+
address: '0x1::aptos_coin::AptosCoin',
|
|
240
|
+
symbol: 'APT',
|
|
241
|
+
name: 'Aptos Coin',
|
|
242
|
+
decimals: 8,
|
|
243
|
+
// @ts-expect-error issuer is Stellar-specific token data.
|
|
244
|
+
issuer: 'GDMTVHLWJTHSUDMZVVMXXH6VJHA2ZV3HNG5LYNAZ6RTWB7GISM6PGTUV',
|
|
245
|
+
})
|
|
246
|
+
})
|
|
247
|
+
})
|
|
248
|
+
})
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, expect, expectTypeOf, it } from 'vitest'
|
|
2
|
+
import { EvmChainId } from '../../evm/chain/chains.js'
|
|
3
|
+
import { EvmNative } from '../../evm/currency/native.js'
|
|
4
|
+
import { EvmToken } from '../../evm/currency/token.js'
|
|
5
|
+
import { MvmChainId } from '../../mvm/chain/chains.js'
|
|
6
|
+
import { MvmToken } from '../../mvm/currency/token.js'
|
|
7
|
+
import { StellarChainId } from '../../stellar/chain/chains.js'
|
|
8
|
+
import { StellarToken } from '../../stellar/currency/token.js'
|
|
9
|
+
import { SvmChainId } from '../../svm/chain/chains.js'
|
|
10
|
+
import { SvmNative } from '../../svm/currency/native.js'
|
|
11
|
+
import { SvmToken, svmAddress } from '../../svm/currency/token.js'
|
|
12
|
+
import { getNativeFor, getTokenFor } from './for-chain.js'
|
|
13
|
+
|
|
14
|
+
describe('generic/currency/for-chain.ts', () => {
|
|
15
|
+
describe('getNativeFor', () => {
|
|
16
|
+
it('creates EVM native currencies with metadata', () => {
|
|
17
|
+
type Metadata = { verified: boolean }
|
|
18
|
+
const metadata: Metadata = { verified: true }
|
|
19
|
+
|
|
20
|
+
const native = getNativeFor(EvmChainId.ETHEREUM, metadata)
|
|
21
|
+
|
|
22
|
+
expect(native).toBeInstanceOf(EvmNative)
|
|
23
|
+
expect(native.chainId).toBe(EvmChainId.ETHEREUM)
|
|
24
|
+
expect(native.metadata).toBe(metadata)
|
|
25
|
+
expectTypeOf(native).toEqualTypeOf<EvmNative<Metadata>>()
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('creates SVM native currencies with metadata', () => {
|
|
29
|
+
type Metadata = { coingeckoId: string }
|
|
30
|
+
const metadata: Metadata = { coingeckoId: 'solana' }
|
|
31
|
+
|
|
32
|
+
const native = getNativeFor(SvmChainId.SOLANA, metadata)
|
|
33
|
+
|
|
34
|
+
expect(native).toBeInstanceOf(SvmNative)
|
|
35
|
+
expect(native.chainId).toBe(SvmChainId.SOLANA)
|
|
36
|
+
expect(native.metadata).toBe(metadata)
|
|
37
|
+
expectTypeOf(native).toEqualTypeOf<SvmNative<Metadata>>()
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
describe('getTokenFor', () => {
|
|
42
|
+
it('creates EVM tokens from constructor data', () => {
|
|
43
|
+
type Metadata = { logoUrl: string }
|
|
44
|
+
const metadata: Metadata = { logoUrl: 'https://example.com/token.png' }
|
|
45
|
+
|
|
46
|
+
const token = getTokenFor(EvmChainId.ETHEREUM, {
|
|
47
|
+
chainId: EvmChainId.POLYGON,
|
|
48
|
+
address: '0x1234567890abcdef1234567890abcdef12345678',
|
|
49
|
+
symbol: 'TEST',
|
|
50
|
+
name: 'Test Token',
|
|
51
|
+
decimals: 18,
|
|
52
|
+
metadata,
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
expect(token).toBeInstanceOf(EvmToken)
|
|
56
|
+
expect(token.chainId).toBe(EvmChainId.ETHEREUM)
|
|
57
|
+
expect(token.metadata).toBe(metadata)
|
|
58
|
+
expectTypeOf(token).toEqualTypeOf<EvmToken<Metadata>>()
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('creates MVM tokens from constructor data', () => {
|
|
62
|
+
const token = getTokenFor(MvmChainId.APTOS, {
|
|
63
|
+
address: '0x1::aptos_coin::AptosCoin',
|
|
64
|
+
symbol: 'APT',
|
|
65
|
+
name: 'Aptos Coin',
|
|
66
|
+
decimals: 8,
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
expect(token).toBeInstanceOf(MvmToken)
|
|
70
|
+
expect(token.chainId).toBe(MvmChainId.APTOS)
|
|
71
|
+
expectTypeOf(token).toEqualTypeOf<MvmToken<Record<string, unknown>>>()
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it('creates SVM tokens from constructor data', () => {
|
|
75
|
+
type Metadata = { tags: string[] }
|
|
76
|
+
const metadata: Metadata = { tags: ['stablecoin'] }
|
|
77
|
+
|
|
78
|
+
const token = getTokenFor(SvmChainId.SOLANA, {
|
|
79
|
+
address: svmAddress('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
|
|
80
|
+
symbol: 'USDC',
|
|
81
|
+
name: 'USD Coin',
|
|
82
|
+
decimals: 6,
|
|
83
|
+
metadata,
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
expect(token).toBeInstanceOf(SvmToken)
|
|
87
|
+
expect(token.chainId).toBe(SvmChainId.SOLANA)
|
|
88
|
+
expect(token.metadata).toBe(metadata)
|
|
89
|
+
expectTypeOf(token).toEqualTypeOf<SvmToken<Metadata>>()
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('creates Stellar tokens from constructor data', () => {
|
|
93
|
+
const token = getTokenFor(StellarChainId.STELLAR, {
|
|
94
|
+
address: 'CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA',
|
|
95
|
+
issuer: 'GDMTVHLWJTHSUDMZVVMXXH6VJHA2ZV3HNG5LYNAZ6RTWB7GISM6PGTUV',
|
|
96
|
+
symbol: 'XLM',
|
|
97
|
+
name: 'XLM',
|
|
98
|
+
decimals: 7,
|
|
99
|
+
origin: 'stellar.org',
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
expect(token).toBeInstanceOf(StellarToken)
|
|
103
|
+
expect(token.chainId).toBe(StellarChainId.STELLAR)
|
|
104
|
+
expect(token.origin).toBe('stellar.org')
|
|
105
|
+
expectTypeOf(token).toEqualTypeOf<StellarToken<Record<string, unknown>>>()
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
})
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type EvmChainId,
|
|
3
|
+
getEvmChainById,
|
|
4
|
+
isEvmChainId,
|
|
5
|
+
} from '../../evm/chain/chains.js'
|
|
6
|
+
import { EvmNative } from '../../evm/currency/native.js'
|
|
7
|
+
import { EvmToken } from '../../evm/currency/token.js'
|
|
8
|
+
import { isMvmChainId, type MvmChainId } from '../../mvm/chain/chains.js'
|
|
9
|
+
import { MvmToken } from '../../mvm/currency/token.js'
|
|
10
|
+
import {
|
|
11
|
+
isStellarChainId,
|
|
12
|
+
type StellarChainId,
|
|
13
|
+
} from '../../stellar/chain/chains.js'
|
|
14
|
+
import { StellarToken } from '../../stellar/currency/token.js'
|
|
15
|
+
import {
|
|
16
|
+
getSvmChainById,
|
|
17
|
+
isSvmChainId,
|
|
18
|
+
type SvmChainId,
|
|
19
|
+
} from '../../svm/chain/chains.js'
|
|
20
|
+
import { SvmNative } from '../../svm/currency/native.js'
|
|
21
|
+
import { SvmToken } from '../../svm/currency/token.js'
|
|
22
|
+
import type { ChainId } from '../chain/chains.js'
|
|
23
|
+
import type {
|
|
24
|
+
AddressFor,
|
|
25
|
+
NativeChainId,
|
|
26
|
+
NativeFor,
|
|
27
|
+
TokenFor,
|
|
28
|
+
} from '../types/for-chain.js'
|
|
29
|
+
import { assertNever } from '../utils/assert-never.js'
|
|
30
|
+
import type { CurrencyMetadata } from './currency.js'
|
|
31
|
+
|
|
32
|
+
type ConstructorData<T extends abstract new (...args: any) => any> =
|
|
33
|
+
ConstructorParameters<T>[0] extends { chainId: infer TChainId }
|
|
34
|
+
? Omit<ConstructorParameters<T>[0], 'chainId'> & { chainId?: TChainId }
|
|
35
|
+
: never
|
|
36
|
+
|
|
37
|
+
type EvmTokenConstructorData<TMetadata extends CurrencyMetadata> =
|
|
38
|
+
ConstructorData<typeof EvmToken<TMetadata>>
|
|
39
|
+
type MvmTokenConstructorData<TMetadata extends CurrencyMetadata> =
|
|
40
|
+
ConstructorData<typeof MvmToken<TMetadata>>
|
|
41
|
+
type SvmTokenConstructorData<TMetadata extends CurrencyMetadata> =
|
|
42
|
+
ConstructorData<typeof SvmToken<TMetadata>>
|
|
43
|
+
type StellarTokenConstructorData<TMetadata extends CurrencyMetadata> =
|
|
44
|
+
ConstructorData<typeof StellarToken<TMetadata>>
|
|
45
|
+
|
|
46
|
+
type GenericTokenConstructorData<
|
|
47
|
+
TChainId extends ChainId,
|
|
48
|
+
TMetadata extends CurrencyMetadata,
|
|
49
|
+
> = {
|
|
50
|
+
chainId?: TChainId
|
|
51
|
+
address: AddressFor<TChainId>
|
|
52
|
+
symbol: string
|
|
53
|
+
name: string
|
|
54
|
+
decimals: number
|
|
55
|
+
metadata?: TMetadata
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type TokenConstructorDataFor<
|
|
59
|
+
TChainId extends ChainId,
|
|
60
|
+
TMetadata extends CurrencyMetadata = CurrencyMetadata,
|
|
61
|
+
> =
|
|
62
|
+
| GenericTokenConstructorData<TChainId, TMetadata>
|
|
63
|
+
| (TChainId extends EvmChainId
|
|
64
|
+
? EvmTokenConstructorData<TMetadata>
|
|
65
|
+
: TChainId extends MvmChainId
|
|
66
|
+
? MvmTokenConstructorData<TMetadata>
|
|
67
|
+
: TChainId extends SvmChainId
|
|
68
|
+
? SvmTokenConstructorData<TMetadata>
|
|
69
|
+
: TChainId extends StellarChainId
|
|
70
|
+
? StellarTokenConstructorData<TMetadata>
|
|
71
|
+
: never)
|
|
72
|
+
|
|
73
|
+
export function getNativeFor<
|
|
74
|
+
TChainId extends NativeChainId,
|
|
75
|
+
TMetadata extends CurrencyMetadata,
|
|
76
|
+
>(chainId: TChainId, metadata: TMetadata): NativeFor<TChainId, TMetadata> {
|
|
77
|
+
if (isEvmChainId(chainId)) {
|
|
78
|
+
const chain = getEvmChainById(chainId)
|
|
79
|
+
|
|
80
|
+
return new EvmNative({
|
|
81
|
+
chainId,
|
|
82
|
+
symbol: chain.viemChain.nativeCurrency.symbol,
|
|
83
|
+
name: chain.viemChain.nativeCurrency.name,
|
|
84
|
+
decimals: chain.viemChain.nativeCurrency.decimals,
|
|
85
|
+
metadata,
|
|
86
|
+
}) as NativeFor<TChainId, TMetadata>
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (isSvmChainId(chainId)) {
|
|
90
|
+
const chain = getSvmChainById(chainId)
|
|
91
|
+
|
|
92
|
+
return new SvmNative({
|
|
93
|
+
chainId,
|
|
94
|
+
symbol: chain.nativeCurrency.symbol,
|
|
95
|
+
name: chain.nativeCurrency.name,
|
|
96
|
+
decimals: chain.nativeCurrency.decimals,
|
|
97
|
+
metadata,
|
|
98
|
+
}) as NativeFor<TChainId, TMetadata>
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
assertNever(chainId, `getNativeFor, unsupported chainId: ${chainId}`)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function getTokenFor<
|
|
105
|
+
TChainId extends ChainId,
|
|
106
|
+
TMetadata extends CurrencyMetadata = Record<string, unknown>,
|
|
107
|
+
>(
|
|
108
|
+
chainId: TChainId,
|
|
109
|
+
data: TokenConstructorDataFor<TChainId, TMetadata>,
|
|
110
|
+
): TokenFor<TChainId, TMetadata> {
|
|
111
|
+
if (isEvmChainId(chainId)) {
|
|
112
|
+
return new EvmToken({
|
|
113
|
+
...data,
|
|
114
|
+
chainId,
|
|
115
|
+
} as ConstructorParameters<typeof EvmToken<TMetadata>>[0]) as TokenFor<
|
|
116
|
+
TChainId,
|
|
117
|
+
TMetadata
|
|
118
|
+
>
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (isMvmChainId(chainId)) {
|
|
122
|
+
return new MvmToken({
|
|
123
|
+
...data,
|
|
124
|
+
chainId,
|
|
125
|
+
} as ConstructorParameters<typeof MvmToken<TMetadata>>[0]) as TokenFor<
|
|
126
|
+
TChainId,
|
|
127
|
+
TMetadata
|
|
128
|
+
>
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (isSvmChainId(chainId)) {
|
|
132
|
+
return new SvmToken({
|
|
133
|
+
...data,
|
|
134
|
+
chainId,
|
|
135
|
+
} as ConstructorParameters<typeof SvmToken<TMetadata>>[0]) as TokenFor<
|
|
136
|
+
TChainId,
|
|
137
|
+
TMetadata
|
|
138
|
+
>
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (isStellarChainId(chainId)) {
|
|
142
|
+
return new StellarToken({
|
|
143
|
+
...data,
|
|
144
|
+
chainId,
|
|
145
|
+
} as ConstructorParameters<typeof StellarToken<TMetadata>>[0]) as TokenFor<
|
|
146
|
+
TChainId,
|
|
147
|
+
TMetadata
|
|
148
|
+
>
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
assertNever(chainId, `getTokenFor, unsupported chainId: ${chainId}`)
|
|
152
|
+
}
|