Skip to content

Commit

Permalink
Add tests; Asset func renames; Append slash helper
Browse files Browse the repository at this point in the history
  • Loading branch information
Sluder committed Nov 15, 2023
1 parent afd9c5c commit e2b1cdf
Show file tree
Hide file tree
Showing 21 changed files with 119 additions and 58 deletions.
9 changes: 2 additions & 7 deletions jest.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,7 @@ module.exports = {
'<rootDir>/node_modules/',
],
transform: {
'^.+\\.tsx?$': [
'ts-jest',
{
useESM: true,
},
],
"^.+\\.ts?$": "babel-jest",
},
roots: ['<rootDir>'],
modulePaths: ['<rootDir>'],
Expand All @@ -22,4 +17,4 @@ module.exports = {
'@providers/(.*)': '<rootDir>/src/providers/$1',
'@requests/(.*)': '<rootDir>/src/requests/$1',
}
};
};
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion src/dex/api/minswap-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Minswap } from '../minswap';
import { RequestConfig } from '@app/types';
import AES from 'crypto-js/aes';
import Utf8 from 'crypto-js/enc-utf8';
import { appendSlash } from '@app/utils';

const AES_KEY: string = '22eaca439bfd89cf125827a7a33fe3970d735dbfd5d84f19dd95820781fc47be';

Expand All @@ -21,7 +22,7 @@ export class MinswapApi extends BaseApi {

this.api = axios.create({
timeout: requestConfig.timeout,
baseURL: `${requestConfig.proxyUrl}https://monorepo-mainnet-prod.minswap.org/graphql`,
baseURL: `${appendSlash(requestConfig.proxyUrl)}https://monorepo-mainnet-prod.minswap.org/graphql`,
withCredentials: false,
});
}
Expand Down
7 changes: 4 additions & 3 deletions src/dex/api/muesliswap-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { LiquidityPool } from '../models/liquidity-pool';
import axios, { AxiosInstance } from 'axios';
import { MuesliSwap } from '../muesliswap';
import { RequestConfig } from '@app/types';
import { appendSlash } from '@app/utils';

export class MuesliSwapApi extends BaseApi {

Expand All @@ -16,7 +17,7 @@ export class MuesliSwapApi extends BaseApi {
this.dex = dex;
this.api = axios.create({
timeout: requestConfig.timeout,
baseURL: `${requestConfig.proxyUrl}https://api.muesliswap.com/`,
baseURL: `${appendSlash(requestConfig.proxyUrl)}https://api.muesliswap.com/`,
headers: {
'Content-Type': 'application/json',
}
Expand All @@ -27,9 +28,9 @@ export class MuesliSwapApi extends BaseApi {
const providers: string[] = ['muesliswap', 'muesliswap_v2', 'muesliswap_clp'];
const tokenA: string = (assetA === 'lovelace')
? '.'
: assetA.id('.');
: assetA.identifier('.');
const tokenB: string = (assetB && assetB !== 'lovelace')
? assetB.id('.')
? assetB.identifier('.')
: '';

return this.api.get(`/liquidity/pools?providers=${providers.join(',')}&token-a=${tokenA}&token-b=${tokenB}`)
Expand Down
13 changes: 7 additions & 6 deletions src/dex/api/sundaeswap-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { LiquidityPool } from '../models/liquidity-pool';
import axios, { AxiosInstance } from 'axios';
import { SundaeSwap } from '../sundaeswap';
import { RequestConfig } from '@app/types';
import { appendSlash } from '@app/utils';

export class SundaeSwapApi extends BaseApi {

Expand All @@ -16,7 +17,7 @@ export class SundaeSwapApi extends BaseApi {
this.dex = dex;
this.api = axios.create({
timeout: requestConfig.timeout,
baseURL: `${requestConfig.proxyUrl}https://stats.sundaeswap.finance/graphql`,
baseURL: `${appendSlash(requestConfig.proxyUrl)}https://stats.sundaeswap.finance/graphql`,
headers: {
'Content-Type': 'application/json',
}
Expand All @@ -28,9 +29,9 @@ export class SundaeSwapApi extends BaseApi {

const assetAId: string = (assetA === 'lovelace')
? ''
: assetA.id('.');
: assetA.identifier('.');
let assetBId: string = (assetB && assetB !== 'lovelace')
? assetB.id('.')
? assetB.identifier('.')
: '';

const getPaginatedResponse = (page: number): Promise<LiquidityPool[]> => {
Expand Down Expand Up @@ -76,10 +77,10 @@ export class SundaeSwapApi extends BaseApi {
let liquidityPool: LiquidityPool = new LiquidityPool(
SundaeSwap.identifier,
pool.assetA.assetId
? Asset.fromId(pool.assetA.assetId, pool.assetA.decimals)
? Asset.fromIdentifier(pool.assetA.assetId, pool.assetA.decimals)
: 'lovelace',
pool.assetB.assetId
? Asset.fromId(pool.assetB.assetId, pool.assetB.decimals)
? Asset.fromIdentifier(pool.assetB.assetId, pool.assetB.decimals)
: 'lovelace',
BigInt(pool.quantityA),
BigInt(pool.quantityB),
Expand All @@ -89,7 +90,7 @@ export class SundaeSwapApi extends BaseApi {
);

liquidityPool.identifier = pool.ident;
liquidityPool.lpToken = Asset.fromId(pool.assetLP.assetId);
liquidityPool.lpToken = Asset.fromIdentifier(pool.assetLP.assetId);
liquidityPool.poolFeePercent = Number(pool.fee);

return liquidityPool;
Expand Down
7 changes: 4 additions & 3 deletions src/dex/api/vyfinance-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { LiquidityPool } from '../models/liquidity-pool';
import axios, { AxiosInstance } from 'axios';
import { VyFinance } from '../vyfinance';
import { RequestConfig } from '@app/types';
import { appendSlash } from '@app/utils';

export class VyfinanceApi extends BaseApi {

Expand All @@ -16,7 +17,7 @@ export class VyfinanceApi extends BaseApi {
this.dex = dex;
this.api = axios.create({
timeout: requestConfig.timeout,
baseURL: `${requestConfig.proxyUrl}https://api.vyfi.io`,
baseURL: `${appendSlash(requestConfig.proxyUrl)}https://api.vyfi.io`,
headers: {
'Content-Type': 'application/json',
}
Expand All @@ -26,9 +27,9 @@ export class VyfinanceApi extends BaseApi {
liquidityPools(assetA: Token, assetB?: Token): Promise<LiquidityPool[]> {
const assetAId: string = (assetA === 'lovelace')
? 'lovelace'
: assetA.id();
: assetA.identifier();
let assetBId: string = (assetB && assetB !== 'lovelace')
? assetB.id()
? assetB.identifier()
: 'lovelace';

const url: string = assetB
Expand Down
3 changes: 2 additions & 1 deletion src/dex/api/wingriders-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { LiquidityPool } from '../models/liquidity-pool';
import axios, { AxiosInstance } from 'axios';
import { RequestConfig } from '@app/types';
import { WingRiders } from '@dex/wingriders';
import { appendSlash } from '@app/utils';

export class WingRidersApi extends BaseApi {

Expand All @@ -16,7 +17,7 @@ export class WingRidersApi extends BaseApi {
this.dex = dex;
this.api = axios.create({
timeout: requestConfig.timeout,
baseURL: `${requestConfig.proxyUrl}https://api.mainnet.wingriders.com/graphql`,
baseURL: `${appendSlash(requestConfig.proxyUrl)}https://api.mainnet.wingriders.com/graphql`,
headers: {
'Content-Type': 'application/json',
}
Expand Down
6 changes: 3 additions & 3 deletions src/dex/minswap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ export class Minswap extends BaseDex {
}

public async liquidityPoolAddresses(provider: BaseDataProvider): Promise<string[]> {
const validityAsset: Asset = Asset.fromId(this.poolValidityAsset);
const validityAsset: Asset = Asset.fromIdentifier(this.poolValidityAsset);
const assetAddresses: AssetAddress[] = await provider.assetAddresses(validityAsset);

return Promise.resolve([...new Set(assetAddresses.map((assetAddress: AssetAddress) => assetAddress.address))]);
}

public async liquidityPools(provider: BaseDataProvider): Promise<LiquidityPool[]> {
const validityAsset: Asset = Asset.fromId(this.poolValidityAsset);
const validityAsset: Asset = Asset.fromIdentifier(this.poolValidityAsset);
const poolAddresses: string[] = await this.liquidityPoolAddresses(provider);

const addressPromises: Promise<LiquidityPool[]>[] = poolAddresses.map(async (address: string) => {
Expand Down Expand Up @@ -75,7 +75,7 @@ export class Minswap extends BaseDex {

const relevantAssets: AssetBalance[] = utxo.assetBalances
.filter((assetBalance: AssetBalance) => {
const assetBalanceId: string = assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.id();
const assetBalanceId: string = assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.identifier();

return assetBalanceId !== this.poolValidityAsset
&& ! assetBalanceId.startsWith(this.lpTokenPolicyId)
Expand Down
4 changes: 2 additions & 2 deletions src/dex/models/asset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export class Asset {
this.decimals = decimals;
}

static fromId(id: string, decimals: number = 0): Asset {
static fromIdentifier(id: string, decimals: number = 0): Asset {
id = id.replace('.', '');

return new Asset(
Expand All @@ -20,7 +20,7 @@ export class Asset {
);
}

id(dilimeter: '' | '.' = ''): string {
identifier(dilimeter: '' | '.' = ''): string {
return this.policyId + dilimeter + this.nameHex;
}

Expand Down
6 changes: 3 additions & 3 deletions src/dex/muesliswap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@ export class MuesliSwap extends BaseDex {
}

public async liquidityPoolAddresses(provider: BaseDataProvider): Promise<string[]> {
const validityAsset: Asset = Asset.fromId(this.factoryToken);
const validityAsset: Asset = Asset.fromIdentifier(this.factoryToken);
const assetAddresses: AssetAddress[] = await provider.assetAddresses(validityAsset);

return Promise.resolve([...new Set(assetAddresses.map((assetAddress: AssetAddress) => assetAddress.address))]);
}

async liquidityPools(provider: BaseDataProvider): Promise<LiquidityPool[]> {
const validityAsset: Asset = Asset.fromId(this.factoryToken);
const validityAsset: Asset = Asset.fromIdentifier(this.factoryToken);
const poolAddresses: string[] = await this.liquidityPoolAddresses(provider);

const addressPromises: Promise<LiquidityPool[]>[] = poolAddresses.map(async (address: string) => {
Expand Down Expand Up @@ -76,7 +76,7 @@ export class MuesliSwap extends BaseDex {
}

const relevantAssets: AssetBalance[] = utxo.assetBalances.filter((assetBalance: AssetBalance) => {
const assetBalanceId: string = assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.id();
const assetBalanceId: string = assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.identifier();

return ! assetBalanceId.startsWith(this.factoryToken.slice(0, 56))
&& ! assetBalanceId.startsWith(this.poolNftPolicyId);
Expand Down
2 changes: 1 addition & 1 deletion src/dex/sundaeswap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ export class SundaeSwap extends BaseDex {
}

const relevantAssets: AssetBalance[] = utxo.assetBalances.filter((assetBalance: AssetBalance) => {
const assetBalanceId: string = assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.id();
const assetBalanceId: string = assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.identifier();

return ! assetBalanceId.startsWith(this.lpTokenPolicyId);
});
Expand Down
8 changes: 4 additions & 4 deletions src/dex/wingriders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export class WingRiders extends BaseDex {
}

public async liquidityPoolAddresses(provider: BaseDataProvider): Promise<string[]> {
const validityAsset: Asset = Asset.fromId(this.poolValidityAsset);
const validityAsset: Asset = Asset.fromIdentifier(this.poolValidityAsset);
const assetAddresses: AssetAddress[] = this._assetAddresses.length > 0
? this._assetAddresses
: await provider.assetAddresses(validityAsset);
Expand All @@ -56,7 +56,7 @@ export class WingRiders extends BaseDex {
}

async liquidityPools(provider: BaseDataProvider): Promise<LiquidityPool[]> {
const validityAsset: Asset = Asset.fromId(this.poolValidityAsset);
const validityAsset: Asset = Asset.fromIdentifier(this.poolValidityAsset);
const poolAddresses: string[] = await this.liquidityPoolAddresses(provider);

const addressPromises: Promise<LiquidityPool[]>[] = poolAddresses.map(async (address: string) => {
Expand All @@ -83,10 +83,10 @@ export class WingRiders extends BaseDex {
return Promise.resolve(undefined);
}

const validityAsset: Asset = Asset.fromId(this.poolValidityAsset);
const validityAsset: Asset = Asset.fromIdentifier(this.poolValidityAsset);

const relevantAssets: AssetBalance[] = utxo.assetBalances.filter((assetBalance: AssetBalance) => {
const assetBalanceId: string = assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.id();
const assetBalanceId: string = assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.identifier();

return ! assetBalanceId.startsWith(validityAsset.policyId);
});
Expand Down
2 changes: 1 addition & 1 deletion src/providers/asset-metadata/token-registry-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export class TokenRegistryProvider extends BaseMetadataProvider {
*/
fetch(assets: Asset[]): Promise<AssetMetadata[]> {
return this._api.post('/metadata/query', {
subjects: assets.map((asset: Asset) => asset.id()),
subjects: assets.map((asset: Asset) => asset.identifier()),
}).then((response) => response.data.subjects.map((entry: any) => {
return {
policyId: entry.subject.slice(0, 56),
Expand Down
10 changes: 5 additions & 5 deletions src/providers/data/blockfrost-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export class BlockfrostProvider extends BaseDataProvider {
* https://docs.blockfrost.io/#tag/Cardano-Addresses/paths/~1addresses~1%7Baddress%7D~1utxos~1%7Basset%7D/get
*/
public async utxos(address: string, asset?: Asset): Promise<UTxO[]> {
return this.sendPaginatedRequest(`/addresses/${address}/utxos/${asset ? asset.id() : ''}`)
return this.sendPaginatedRequest(`/addresses/${address}/utxos/${asset ? asset.identifier() : ''}`)
.then((results: any) => {
return results.map((utxo: any) => {
return {
Expand All @@ -70,7 +70,7 @@ export class BlockfrostProvider extends BaseDataProvider {
outputIndex: utxo.output_index,
assetBalances: utxo.amount.reduce((assets: AssetBalance[], amount: any) => {
assets.push({
asset: amount.unit === 'lovelace' ? amount.unit : Asset.fromId(amount.unit),
asset: amount.unit === 'lovelace' ? amount.unit : Asset.fromIdentifier(amount.unit),
quantity: BigInt(amount.quantity),
})
return assets;
Expand All @@ -94,7 +94,7 @@ export class BlockfrostProvider extends BaseDataProvider {
outputIndex: utxo.output_index,
assetBalances: utxo.amount.reduce((assets: AssetBalance[], amount: any) => {
assets.push({
asset: amount.unit === 'lovelace' ? amount.unit : Asset.fromId(amount.unit),
asset: amount.unit === 'lovelace' ? amount.unit : Asset.fromIdentifier(amount.unit),
quantity: BigInt(amount.quantity),
})
return assets;
Expand All @@ -108,7 +108,7 @@ export class BlockfrostProvider extends BaseDataProvider {
* https://docs.blockfrost.io/#tag/Cardano-Assets/paths/~1assets~1%7Basset%7D~1transactions/get
*/
public async assetTransactions(asset: Asset): Promise<Transaction[]> {
return this.sendPaginatedRequest(`/assets/${asset.id()}/transactions`)
return this.sendPaginatedRequest(`/assets/${asset.identifier()}/transactions`)
.then((results: any) => {
return results.map((tx: any) => {
return {
Expand All @@ -122,7 +122,7 @@ export class BlockfrostProvider extends BaseDataProvider {
* https://docs.blockfrost.io/#tag/Cardano-Assets/paths/~1assets~1%7Basset%7D~1transactions/get
*/
public async assetAddresses(asset: Asset): Promise<AssetAddress[]> {
return this.sendPaginatedRequest(`/assets/${asset.id()}/addresses`)
return this.sendPaginatedRequest(`/assets/${asset.identifier()}/addresses`)
.then((results: any) => {
return results.map((result: any) => {
return {
Expand Down
8 changes: 4 additions & 4 deletions src/providers/data/kupo-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export class KupoProvider extends BaseDataProvider {
}

public async assetTransactions(asset: Asset): Promise<Transaction[]> {
return this._kupoApi.get(`/matches/${asset.id('.')}`)
return this._kupoApi.get(`/matches/${asset.identifier('.')}`)
.then((results: any) => {
return results.data.map((result: any) => {
return {
Expand All @@ -84,12 +84,12 @@ export class KupoProvider extends BaseDataProvider {
}

public async assetAddresses(asset: Asset): Promise<AssetAddress[]> {
return this._kupoApi.get(`/matches/${asset.id('.')}?unspent`)
return this._kupoApi.get(`/matches/${asset.identifier('.')}?unspent`)
.then((results: any) => {
return results.data.map((result: any) => {
return {
address: result.address,
quantity: BigInt(result.value.assets[asset.id('.')]),
quantity: BigInt(result.value.assets[asset.identifier('.')]),
} as AssetAddress
}) as AssetAddress[];
});
Expand All @@ -111,7 +111,7 @@ export class KupoProvider extends BaseDataProvider {
];
Object.keys(utxo.value.assets).forEach((unit: string) => {
balances.push({
asset: Asset.fromId(unit),
asset: Asset.fromIdentifier(unit),
quantity: BigInt(utxo.value.assets[unit]),
});
});
Expand Down
2 changes: 1 addition & 1 deletion src/providers/wallet/lucid-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export class LucidProvider extends BaseWalletProvider {
private paymentFromAssets(assetBalances: AssetBalance[]): Assets {
return assetBalances
.reduce((payment: Record<Unit | 'lovelace', bigint>, assetBalance: AssetBalance) => {
payment[assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.id()] = assetBalance.quantity;
payment[assetBalance.asset === 'lovelace' ? 'lovelace' : assetBalance.asset.identifier()] = assetBalance.quantity;

return payment;
}, {} as Assets);
Expand Down
4 changes: 2 additions & 2 deletions src/requests/fetch-request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -230,10 +230,10 @@ export class FetchRequest {
*/
private async fetchAssetMetadata(liquidityPools: LiquidityPool[]) {
const assets: Asset[] = liquidityPools.reduce((results: Asset[], liquidityPool: LiquidityPool) => {
if (liquidityPool.assetA !== 'lovelace' && ! results.some((asset: Asset) => asset.id() === (liquidityPool.assetA as Asset).id())) {
if (liquidityPool.assetA !== 'lovelace' && ! results.some((asset: Asset) => asset.identifier() === (liquidityPool.assetA as Asset).identifier())) {
results.push(liquidityPool.assetA);
}
if (liquidityPool.assetB !== 'lovelace' && ! results.some((asset: Asset) => asset.id() === (liquidityPool.assetB as Asset).id())) {
if (liquidityPool.assetB !== 'lovelace' && ! results.some((asset: Asset) => asset.identifier() === (liquidityPool.assetB as Asset).identifier())) {
results.push(liquidityPool.assetB);
}

Expand Down
Loading

0 comments on commit e2b1cdf

Please sign in to comment.