Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/automation-scripts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"build:esm": "tsc -p tsconfig.json",
"build:dirty": "pnpm build:esm",
"pre-commit": "lint-staged",
"test": "jest",
"erc20-diff": "node dist/cjs/commands/erc20/diff.js",
"gen-erc20-list": "node dist/cjs/commands/erc20/createNewList.js",
"download-erc20-images": "node dist/cjs/commands/erc20/downloadImages.js",
Expand Down
18 changes: 18 additions & 0 deletions packages/automation-scripts/src/__mocks__/coingecko.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { jest } from '@jest/globals';
import { CoingeckoCoinDetails, CoingeckoCoinListItem } from '../tokens';

export const getCoingeckoCoinList =
jest.fn<() => Promise<CoingeckoCoinListItem[]>>();
export const getCoingeckoCoinDetails =
jest.fn<() => Promise<CoingeckoCoinDetails>>();

jest.mock('../tokens/coingecko', () => {
const originalModule: any = jest.requireActual('../../src/tokens/coingecko');

return {
__esModule: true,
...originalModule,
getCoingeckoCoinList,
getCoingeckoCoinDetails,
};
});
1 change: 1 addition & 0 deletions packages/automation-scripts/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './tokens';
export * from './translate';
15 changes: 15 additions & 0 deletions packages/automation-scripts/src/tokens/asserts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { assert } from '@cypherock/cysync-utils';
import { TokenAutomationParams } from './types';

export const assertTokenAutomationParams = (params: TokenAutomationParams) => {
assert(params, 'Token automation params are not provided');
assert(params.createTokenAssetId, 'createTokenAssetId is not provided');
assert(params.tokenJsonList, 'tokenJsonList is not provided');
assert(params.coinList, 'coinList is not provided');
assert(params.coinIdMap, 'coinIdMap is not provided');
assert(
params.coingeckoPlatformMapping,
'coingeckoPlatformMapping is not provided',
);
assert(params.filePrefix, 'filePrefix is not provided');
};
108 changes: 108 additions & 0 deletions packages/automation-scripts/src/tokens/diff/helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import {
CoingeckoCoinListItem,
TokenAutomationParams,
TokenListItem,
} from '../types';

export const createContractMapFromExistingList = (
params: TokenAutomationParams,
) => {
const map: Record<string, TokenListItem | undefined> = {};

for (const coin of params.tokenJsonList) {
if (!coin.platforms) continue;

for (const platform in coin.platforms) {
if (!coin.platforms[platform]) continue;

// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!params.coinList[platform]) continue;

const tokenDetails = coin.platforms[platform];
if (!tokenDetails) continue;

map[`${platform}:${tokenDetails.contract_address.toLowerCase()}`] = {
...coin,
platforms: {
[platform]: {
...tokenDetails,
},
},
};
}
}

return map;
};

export const createContractMapFromCoingeckoList = (
list: CoingeckoCoinListItem[],
params: TokenAutomationParams,
) => {
const map: Record<string, TokenListItem | undefined> = {};

for (const coin of list) {
if (!coin.platforms) continue;

for (const platform in coin.platforms) {
if (!coin.platforms[platform]) continue;

const mappedPlatform = params.coingeckoPlatformMapping[platform];
if (!mappedPlatform) continue;

const contractAddress = coin.platforms[platform];
if (!contractAddress) continue;

map[`${mappedPlatform}:${contractAddress.toLowerCase()}`] = {
id: coin.id,
name: coin.name,
symbol: coin.symbol,
platforms: {
[mappedPlatform]: {
contract_address: contractAddress,
decimal_place: 0,
},
},
};
}
}

return map;
};

export const verifyDuplicateIds = (
list: TokenListItem[],
params: TokenAutomationParams,
) => {
const idSet = new Set();
const duplicateIdList: string[] = [];

for (const coin of list) {
if (!coin.platforms) continue;

for (const platform in coin.platforms) {
if (!coin.platforms[platform]) continue;

const tokenDetails = coin.platforms[platform];
if (!tokenDetails) continue;

const id = params.createTokenAssetId({
parentAssetId: platform,
assetId: coin.id,
version: coin.version,
});

if (idSet.has(id)) {
duplicateIdList.push(id);
} else {
idSet.add(id);
}
}
}

if (duplicateIdList.length > 0) {
throw new Error(
`Duplicate ids found in list: ${duplicateIdList.join(',')}`,
);
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -4,78 +4,16 @@ import path from 'path';

import lodash from 'lodash';

import { getCoingeckoCoinList } from './coingecko';
import {
CoingeckoCoinListItem,
TokenAutomationParams,
TokenListItem,
} from './types';

import { config } from '../config';

const createContractMapFromExistingList = (params: TokenAutomationParams) => {
const map: Record<string, TokenListItem | undefined> = {};

for (const coin of params.tokenJsonList) {
if (!coin.platforms) continue;

for (const platform in coin.platforms) {
if (!coin.platforms[platform]) continue;

// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!params.coinList[platform]) continue;

const tokenDetails = coin.platforms[platform];
if (!tokenDetails) continue;

map[`${platform}:${tokenDetails.contract_address.toLowerCase()}`] = {
...coin,
platforms: {
[platform]: {
...tokenDetails,
},
},
};
}
}
import { getCoingeckoCoinList } from '../coingecko';
import { TokenAutomationParams, TokenListItem } from '../types';

return map;
};

const createContractMapFromCoingeckoList = (
list: CoingeckoCoinListItem[],
params: TokenAutomationParams,
) => {
const map: Record<string, TokenListItem | undefined> = {};

for (const coin of list) {
if (!coin.platforms) continue;

for (const platform in coin.platforms) {
if (!coin.platforms[platform]) continue;

const mappedPlatform = params.coingeckoPlatformMapping[platform];
if (!mappedPlatform) continue;

const contractAddress = coin.platforms[platform];
if (!contractAddress) continue;

map[`${mappedPlatform}:${contractAddress.toLowerCase()}`] = {
id: coin.id,
name: coin.name,
symbol: coin.symbol,
platforms: {
[mappedPlatform]: {
contract_address: contractAddress,
decimal_place: 0,
},
},
};
}
}

return map;
};
import { config } from '../../config';
import {
createContractMapFromCoingeckoList,
createContractMapFromExistingList,
verifyDuplicateIds,
} from './helpers';
import { assertTokenAutomationParams } from '../asserts';

const getChangedContracts = (params: {
sameContracts: string[];
Expand Down Expand Up @@ -176,43 +114,6 @@ const getRemovedContracts = (params: {
return { removedCoinList };
};

const verifyDuplicateIds = (
list: TokenListItem[],
params: TokenAutomationParams,
) => {
const idSet = new Set();
const duplicateIdList: string[] = [];

for (const coin of list) {
if (!coin.platforms) continue;

for (const platform in coin.platforms) {
if (!coin.platforms[platform]) continue;

const tokenDetails = coin.platforms[platform];
if (!tokenDetails) continue;

const id = params.createTokenAssetId({
parentAssetId: platform,
assetId: coin.id,
version: coin.version,
});

if (idSet.has(id)) {
duplicateIdList.push(id);
} else {
idSet.add(id);
}
}
}

if (duplicateIdList.length > 0) {
throw new Error(
`Duplicate ids found in list: ${duplicateIdList.join(',')}`,
);
}
};

const getAddedContracts = (params: {
addedContracts: string[];
coingeckoCoinMap: Record<string, TokenListItem | undefined>;
Expand Down Expand Up @@ -257,6 +158,8 @@ export const getTokenDifference = async (
params: TokenAutomationParams,
dontSaveToFile?: boolean,
) => {
assertTokenAutomationParams(params);

const coingeckoCoinMap = createContractMapFromCoingeckoList(
await getCoingeckoCoinList(),
params,
Expand Down
1 change: 1 addition & 0 deletions packages/automation-scripts/src/tokens/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export * from './diff';
export * from './createNewList';
export * from './downloadImages';
export * from './types';
export * from './coingecko';
37 changes: 37 additions & 0 deletions packages/automation-scripts/tests/01.tokenDiff.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { describe, expect, test } from '@jest/globals';

import * as coingeckoMocks from '../src/__mocks__/coingecko';

import { getTokenDifference } from '../src';
import testCases from './__fixtures__/01.tokenDiff';

describe('getTokenDifference', () => {
beforeAll(() => {
coingeckoMocks.getCoingeckoCoinList.mockReturnValueOnce(
Promise.resolve([]),
);
coingeckoMocks.getCoingeckoCoinDetails.mockReturnValueOnce(
Promise.resolve({} as any),
);
});

describe('should throw error with invalid params', () => {
testCases.invalid.forEach(testCase => {
test(testCase.name, async () => {
await expect(getTokenDifference(testCase.params)).rejects.toThrow(
'AssertionError',
);
});
});
});

describe('should return correct response', () => {
testCases.invalid.forEach(testCase => {
test(testCase.name, async () => {
await expect(getTokenDifference(testCase.params)).rejects.toThrow(
'AssertionError',
);
});
});
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { invalid } from './invalid';
import { valid } from './valid';

const testCases = {
invalid,
valid,
};

export default testCases;
Loading