/
okuswap-api-service.ts
101 lines (95 loc) · 3.31 KB
/
okuswap-api-service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { RubicSdkError } from 'src/common/errors';
import { Cache } from 'src/common/utils/decorators';
import { BlockchainName } from 'src/core/blockchain/models/blockchain-name';
import { EvmEncodeConfig } from 'src/core/blockchain/web3-pure/typed-web3-pure/evm-web3-pure/models/evm-encode-config';
import { Injector } from 'src/core/injector/injector';
import { RUBIC_X_API_OKU_APIKEY, RUBIC_X_API_OKU_BASE_URL } from '../constants/okuswap-api';
import {
OkuQuoteRequestBody,
OkuQuoteResponse,
OkuSubProviderInfo,
OkuSubProvidersRes,
OkuSwapRequestBody,
OkuSwapResponse
} from '../models/okuswap-api-types';
import { OKUSWAP_BLOCKCHAINS } from '../models/okuswap-chain-names';
import { OkuSwapSupportedBlockchain } from '../models/okuswap-on-chain-supported-chains';
export class OkuSwapApiService {
@Cache({
maxAge: 15_000
})
public static async makeQuoteRequest(
subProvider: string,
body: OkuQuoteRequestBody
): Promise<OkuQuoteResponse> {
try {
return Injector.httpClient.post<OkuQuoteResponse>(
`${RUBIC_X_API_OKU_BASE_URL}/${subProvider}/swap_quote`,
body,
{
headers: {
apikey: RUBIC_X_API_OKU_APIKEY
}
}
);
} catch (err) {
throw new RubicSdkError(`[OKUSWAP] Err in api-method makeQuoteRequest - ${err}!`);
}
}
public static async makeSwapRequest(
subProvider: string,
body: OkuSwapRequestBody
): Promise<Pick<EvmEncodeConfig, 'data' | 'to' | 'value'>> {
try {
const { trade } = await Injector.httpClient.post<OkuSwapResponse>(
`${RUBIC_X_API_OKU_BASE_URL}/${subProvider}/execution_information`,
body,
{
headers: {
apikey: RUBIC_X_API_OKU_APIKEY
}
}
);
return {
to: trade.to,
data: trade.data,
value: trade.value
};
} catch (err) {
throw new RubicSdkError(`[OKUSWAP] Err in api-method makeSwapRequest - ${err}!`);
}
}
@Cache({
maxAge: 15_000
})
public static async getOkuSubProvidersForChain(blockchain: BlockchainName): Promise<string[]> {
try {
const { status: subProviders } = await Injector.httpClient.get<OkuSubProvidersRes>(
`${RUBIC_X_API_OKU_BASE_URL}/overview`,
{
headers: {
apikey: RUBIC_X_API_OKU_APIKEY
}
}
);
return subProviders
.filter(p => this.isSupportedProvider(p, blockchain))
.map(p => p.name);
} catch (err) {
throw new RubicSdkError(
`[OKUSWAP] Err in api-method getOkuSubProvidersForChain - ${err}!`
);
}
}
private static isSupportedProvider(
provider: OkuSubProviderInfo,
blockchain: BlockchainName
): boolean {
return (
provider.active &&
!!provider.report?.chains.includes(
OKUSWAP_BLOCKCHAINS[blockchain as OkuSwapSupportedBlockchain]
)
);
}
}