Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add base chain #1579

Merged
merged 13 commits into from
May 27, 2024
Merged
Show file tree
Hide file tree
Changes from 8 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
2 changes: 2 additions & 0 deletions .github/workflows/develop-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ jobs:
CELO_ALFAJORES_SCAN_API_KEY: ${{ secrets.CELO_ALFAJORES_SCAN_API_KEY }}
ARBITRUM_SCAN_API_KEY: ${{ secrets.ARBITRUM_SCAN_API_KEY }}
ARBITRUM_SEPOLIA_SCAN_API_KEY: ${{ secrets.ARBITRUM_SEPOLIA_SCAN_API_KEY }}
BASE_SCAN_API_KEY: ${{ secrets.BASE_SCAN_API_KEY }}
BASE_SEPOLIA_SCAN_API_KEY: ${{ secrets.BASE_SEPOLIA_SCAN_API_KEY }}
MORDOR_ETC_TESTNET: ${{ secrets.MORDOR_ETC_TESTNET }}
ETC_NODE_HTTP_URL: ${{ secrets.ETC_NODE_HTTP_URL }}
SOLANA_TEST_NODE_RPC_URL: ${{ secrets.SOLANA_TEST_NODE_RPC_URL }}
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/master-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ jobs:
CELO_ALFAJORES_SCAN_API_KEY: ${{ secrets.CELO_ALFAJORES_SCAN_API_KEY }}
ARBITRUM_SCAN_API_KEY: ${{ secrets.ARBITRUM_SCAN_API_KEY }}
ARBITRUM_SEPOLIA_SCAN_API_KEY: ${{ secrets.ARBITRUM_SEPOLIA_SCAN_API_KEY }}
BASE_SCAN_API_KEY: ${{ secrets.BASE_SCAN_API_KEY }}
BASE_SEPOLIA_SCAN_API_KEY: ${{ secrets.BASE_SEPOLIA_SCAN_API_KEY }}
MORDOR_ETC_TESTNET: ${{ secrets.MORDOR_ETC_TESTNET }}
ETC_NODE_HTTP_URL: ${{ secrets.ETC_NODE_HTTP_URL }}
DROP_DATABASE: ${{ secrets.DROP_DATABASE_DURING_TEST_PROD }}
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/staging-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ jobs:
CELO_ALFAJORES_SCAN_API_KEY: ${{ secrets.CELO_ALFAJORES_SCAN_API_KEY }}
ARBITRUM_SCAN_API_KEY: ${{ secrets.ARBITRUM_SCAN_API_KEY }}
ARBITRUM_SEPOLIA_SCAN_API_KEY: ${{ secrets.ARBITRUM_SEPOLIA_SCAN_API_KEY }}
BASE_SCAN_API_KEY: ${{ secrets.BASE_SCAN_API_KEY }}
BASE_SEPOLIA_SCAN_API_KEY: ${{ secrets.BASE_SEPOLIA_SCAN_API_KEY }}
MORDOR_ETC_TESTNET: ${{ secrets.MORDOR_ETC_TESTNET }}
ETC_NODE_HTTP_URL: ${{ secrets.ETC_NODE_HTTP_URL }}
DROP_DATABASE: ${{ secrets.DROP_DATABASE_DURING_TEST_STAGING }}
Expand Down
5 changes: 5 additions & 0 deletions config/example.env
Original file line number Diff line number Diff line change
Expand Up @@ -307,3 +307,8 @@ ENABLE_DRAFT_RECURRING_DONATION=true
DRAFT_RECURRING_DONATION_MATCH_EXPIRATION_HOURS=24

OPTIMISTIC_SEPOLIA_SCAN_API_KEY=

BASE_SCAN_API_URL=https://api.basescan.org/api
BASE_SCAN_API_KEY=0000000000000000000000000000000000
BASE_SEPOLIA_SCAN_API_URL=https://api-sepolia.basescan.org/api
BASE_SEPOLIA_SCAN_API_KEY=0000000000000000000000000000000000
6 changes: 6 additions & 0 deletions config/test.env
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ ARBITRUM_SCAN_API_URL=https://api.arbiscan.io/api
ARBITRUM_SCAN_API_KEY=0000000000000000000000000000000000
ARBITRUM_SEPOLIA_SCAN_API_URL=https://api-sepolia.arbiscan.io/api
ARBITRUM_SEPOLIA_SCAN_API_KEY=0000000000000000000000000000000000

BASE_SCAN_API_URL=https://api.basescan.org/api
BASE_SCAN_API_KEY=0000000000000000000000000000000000
BASE_SEPOLIA_SCAN_API_URL=https://api-sepolia.basescan.org/api
BASE_SEPOLIA_SCAN_API_KEY=0000000000000000000000000000000000

GNOSISSCAN_API_URL=https://api.gnosisscan.io/api
ETHERSCAN_API_KEY=00000000000000000000000000000000
GNOSISSCAN_API_KEY=0000000000000000000000000000000000
Expand Down
55 changes: 55 additions & 0 deletions migration/1716367359560-add_base_chain_tokens.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import { Token } from '../src/entities/token';
import seedTokens from './data/seedTokens';
import config from '../src/config';
import { NETWORK_IDS } from '../src/provider';

export class AddBaseChainTokens1716367359560 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
const environment = config.get('ENVIRONMENT') as string;

const networkId =
environment === 'production'
? NETWORK_IDS.BASE_MAINNET
: NETWORK_IDS.BASE_SEPOLIA;

await queryRunner.manager.save(
Token,
seedTokens
.filter(token => token.networkId === networkId)
.map(token => {
const t = {
...token,
};
t.address = t.address?.toLowerCase();
delete t.chainType;
return t;
}),
);
const tokens = await queryRunner.query(`
SELECT * FROM token
WHERE "networkId" = ${networkId}
`);
const givethOrganization = (
await queryRunner.query(`SELECT * FROM organization
WHERE label='giveth'`)
)[0];

const traceOrganization = (
await queryRunner.query(`SELECT * FROM organization
WHERE label='trace'`)
)[0];

for (const token of tokens) {
// Add all Base tokens to Giveth organization
await queryRunner.query(`INSERT INTO organization_tokens_token ("tokenId","organizationId") VALUES
(${token.id}, ${givethOrganization.id}),
(${token.id}, ${traceOrganization.id})
;`);
}
Comment on lines +7 to +49
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ensure proper transaction handling in the up method.

Consider wrapping the database operations within a transaction to ensure atomicity. This is crucial for maintaining data integrity, especially in production environments.

+ await queryRunner.startTransaction();
  try {
    // existing code...
+   await queryRunner.commitTransaction();
  } catch (error) {
+   await queryRunner.rollbackTransaction();
    throw error;
  }

Committable suggestion was skipped due low confidence.

}

public async down(_queryRunner: QueryRunner): Promise<void> {
//
}
Comment on lines +52 to +54
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider implementing a rollback mechanism in the down method to reverse the changes made by the up method.

}
18 changes: 18 additions & 0 deletions migration/data/seedTokens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1593,6 +1593,24 @@ const seedTokens: ITokenData[] = [
networkId: NETWORK_IDS.ARBITRUM_MAINNET,
coingeckoId: 'cartesi',
},

// BASE Sepolia
{
name: 'BASE',
symbol: 'ETH',
address: '0x0000000000000000000000000000000000000000',
decimals: 18,
networkId: NETWORK_IDS.BASE_SEPOLIA,
},

// BASE Mainnet
{
name: 'BASE',
symbol: 'ETH',
address: '0x0000000000000000000000000000000000000000',
decimals: 18,
networkId: NETWORK_IDS.BASE_MAINNET,
},
];

export default seedTokens;
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@
"test:reactionResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/reactionResolver.test.ts",
"test:donationResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/donationResolver.test.ts",
"test:draftDonationResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/draftDonationResolver.test.ts",
"test:projectResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/projectResolver.test.ts",
"test:projectResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/projectResolver.test.ts ./src/resolvers/projectResolver.allProject.test.ts",
"test:chainvineResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/chainvineResolver.test.ts",
"test:qfRoundResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/qfRoundResolver.test.ts",
"test:qfRoundHistoryResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/qfRoundHistoryResolver.test.ts",
Expand Down Expand Up @@ -192,7 +192,7 @@
"test:instantPowerBoostingService": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/services/instantBoostingServices.test.ts",
"test:actualMatchingFundView": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/services/actualMatchingFundView.test.ts",
"test:categoryResolver": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/resolvers/categoryResolver.test.ts",
"test:givpower": "NODE_ENV=test mocha -b -t 30000 ./test/pre-test-scripts.ts ./src/repositories/powerBoostingRepository.test.ts ./src/repositories/userPowerRepository.test.ts ./src/repositories/powerRoundRepository.test.ts ./src/repositories/userProjectPowerViewRepository.test.ts ./src/repositories/projectPowerViewRepository.test.ts ./src/resolvers/powerBoostingResolver.test.ts ./src/resolvers/userProjectPowerResolver.test.ts ./src/resolvers/projectPowerResolver.test.ts ./src/adapters/givpowerSubgraph/givPowerSubgraphAdapter.test.ts ./src/repositories/projectRepository.test.ts ./src/resolvers/projectResolver.test.ts ./src/repositories/dbCronRepository.test.ts",
"test:givpower": "NODE_ENV=test mocha -b -t 30000 ./test/pre-test-scripts.ts ./src/repositories/powerBoostingRepository.test.ts ./src/repositories/userPowerRepository.test.ts ./src/repositories/powerRoundRepository.test.ts ./src/repositories/userProjectPowerViewRepository.test.ts ./src/repositories/projectPowerViewRepository.test.ts ./src/resolvers/powerBoostingResolver.test.ts ./src/resolvers/userProjectPowerResolver.test.ts ./src/resolvers/projectPowerResolver.test.ts ./src/adapters/givpowerSubgraph/givPowerSubgraphAdapter.test.ts ./src/repositories/projectRepository.test.ts ./src/resolvers/projectResolver.test.ts ./src/resolvers/projectResolver.allProject.test.ts ./src/repositories/dbCronRepository.test.ts",
"test:apiGive": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/routers/apiGivRoutes.test.ts",
"test:adminJs": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/server/adminJs/**/*.test.ts ",
"test:adminJsRolePermissions": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/server/adminJs/adminJsPermissions.test.ts",
Expand Down
1 change: 1 addition & 0 deletions src/entities/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ export enum FilterField {
AcceptFundOnETC = 'acceptFundOnETC',
AcceptFundOnCelo = 'acceptFundOnCelo',
AcceptFundOnArbitrum = 'acceptFundOnArbitrum',
AcceptFundOnBase = 'acceptFundOnBase',
AcceptFundOnOptimism = 'acceptFundOnOptimism',
AcceptFundOnSolana = 'acceptFundOnSolana',
GivingBlock = 'fromGivingBlock',
Expand Down
11 changes: 11 additions & 0 deletions src/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ export const NETWORK_IDS = {
ARBITRUM_MAINNET: 42161,
ARBITRUM_SEPOLIA: 421614,

BASE_MAINNET: 8453,
BASE_SEPOLIA: 84532,

// https://docs.particle.network/developers/other-services/node-service/solana-api
SOLANA_MAINNET: 101,
SOLANA_TESTNET: 102,
Expand Down Expand Up @@ -398,6 +401,14 @@ export function getBlockExplorerApiUrl(networkId: number): string {
apiUrl = config.get('ARBITRUM_SEPOLIA_SCAN_API_URL');
apiKey = config.get('ARBITRUM_SEPOLIA_SCAN_API_KEY');
break;
case NETWORK_IDS.BASE_MAINNET:
apiUrl = config.get('BASE_SCAN_API_URL');
apiKey = config.get('BASE_SCAN_API_KEY');
break;
case NETWORK_IDS.BASE_SEPOLIA:
apiUrl = config.get('BASE_SEPOLIA_SCAN_API_URL');
apiKey = config.get('BASE_SEPOLIA_SCAN_API_KEY');
break;
default:
throw new Error(i18n.__(translationErrorMessagesKeys.INVALID_NETWORK_ID));
}
Expand Down
2 changes: 1 addition & 1 deletion src/resolvers/donationResolver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2611,7 +2611,7 @@ function createDonationTestCases() {
);
assert.equal(
saveDonationResponse.data.errors[0].message,
'"transactionNetworkId" must be one of [1, 3, 5, 100, 137, 10, 11155420, 56, 42220, 44787, 61, 63, 42161, 421614, 101, 102, 103]',
'"transactionNetworkId" must be one of [1, 3, 5, 100, 137, 10, 11155420, 56, 42220, 44787, 61, 63, 42161, 421614, 8453, 84532, 101, 102, 103]',
);
});
it('should not throw exception when currency is not valid when currency is USDC.e', async () => {
Expand Down
108 changes: 107 additions & 1 deletion src/resolvers/projectResolver.allProject.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -918,7 +918,6 @@
),
);
});

it('should return projects, filter by accept donation on arbitrum, not return when it doesnt have arbitrum address', async () => {
const arbitrumProject = await saveProjectDirectlyToDb({
...createProjectData(),
Expand Down Expand Up @@ -964,6 +963,113 @@
);
});


Check failure on line 966 in src/resolvers/projectResolver.allProject.test.ts

View workflow job for this annotation

GitHub Actions / test

Delete `⏎`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove unnecessary newline.

-

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change

it('should return projects, filter by accept donation on base', async () => {
const savedProject = await saveProjectDirectlyToDb({
...createProjectData(),
title: String(new Date().getTime()),
slug: String(new Date().getTime()),
networkId: NETWORK_IDS.BASE_MAINNET,
});
const result = await axios.post(graphqlUrl, {
query: fetchMultiFilterAllProjectsQuery,
variables: {
filters: ['AcceptFundOnBase'],
sortingBy: SortingField.Newest,
},
});
result.data.data.allProjects.projects.forEach(project => {
assert.isOk(
project.addresses.find(
address =>
address.isRecipient === true &&
(address.networkId === NETWORK_IDS.BASE_MAINNET ||
address.networkId === NETWORK_IDS.BASE_SEPOLIA),
),
);
});
assert.isOk(
result.data.data.allProjects.projects.find(
project => Number(project.id) === Number(savedProject.id),
),
);
});
it('should return projects, filter by accept donation on base', async () => {
const savedProject = await saveProjectDirectlyToDb({
...createProjectData(),
title: String(new Date().getTime()),
slug: String(new Date().getTime()),
networkId: NETWORK_IDS.BASE_MAINNET,
});
const result = await axios.post(graphqlUrl, {
query: fetchMultiFilterAllProjectsQuery,
variables: {
filters: ['AcceptFundOnBase'],
sortingBy: SortingField.Newest,
},
});
result.data.data.allProjects.projects.forEach(project => {
assert.isOk(
project.addresses.find(
address =>
address.isRecipient === true &&
(address.networkId === NETWORK_IDS.BASE_MAINNET ||
address.networkId === NETWORK_IDS.BASE_SEPOLIA) &&
address.chainType === ChainType.EVM,
),
);
});
assert.isOk(
result.data.data.allProjects.projects.find(
project => Number(project.id) === Number(savedProject.id),
),
);
});
it('should return projects, filter by accept donation on base, not return when it doesnt have base address', async () => {
const baseProject = await saveProjectDirectlyToDb({
...createProjectData(),
title: String(new Date().getTime()),
slug: String(new Date().getTime()),
networkId: NETWORK_IDS.BASE_MAINNET,
});
const polygonProject = await saveProjectDirectlyToDb({
...createProjectData(),
title: String(new Date().getTime()),
slug: String(new Date().getTime()),
networkId: NETWORK_IDS.POLYGON,
});

const result = await axios.post(graphqlUrl, {
query: fetchMultiFilterAllProjectsQuery,
variables: {
filters: ['AcceptFundOnBase'],
sortingBy: SortingField.Newest,
},
});

result.data.data.allProjects.projects.forEach(project => {
assert.isOk(
project.addresses.find(
address =>
address.isRecipient === true &&
(address.networkId === NETWORK_IDS.BASE_MAINNET ||
address.networkId === NETWORK_IDS.BASE_SEPOLIA) &&
address.chainType === ChainType.EVM,
),
);
});
assert.isNotOk(
result.data.data.allProjects.projects.find(
project => Number(project.id) === Number(polygonProject.id),
),
);
assert.isOk(
result.data.data.allProjects.projects.find(
project => Number(project.id) === Number(baseProject.id),
),
);
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactor to use for...of for better readability and performance.

- result.data.data.allProjects.projects.forEach(project => {
+ for (const project of result.data.data.allProjects.projects) {
    assert.isOk(
      project.addresses.find(
        address =>
          address.isRecipient === true &&
          (address.networkId === NETWORK_IDS.BASE_MAINNET ||
            address.networkId === NETWORK_IDS.BASE_SEPOLIA) &&
          address.chainType === ChainType.EVM,
      ),
    );
- });
+ }

Committable suggestion was skipped due low confidence.

Comment on lines +966 to +1070
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactor repeated test cases for better maintainability.

The test cases for filtering by 'AcceptFundOnBase' are repeated three times with slight variations. Consider refactoring these into a single parameterized test function to reduce code duplication and improve maintainability.

- it('should return projects, filter by accept donation on base', async () => { ... });
- it('should return projects, filter by accept donation on base', async () => { ... });
- it('should return projects, filter by accept donation on base, not return when it doesnt have base address', async () => { ... });

+ function testAcceptDonationOnBase(description, setup, assertCondition) {
+   it(description, async () => {
+     await setup();
+     const result = await axios.post(graphqlUrl, {
+       query: fetchMultiFilterAllProjectsQuery,
+       variables: {
+         filters: ['AcceptFundOnBase'],
+         sortingBy: SortingField.Newest,
+       },
+     });
+     result.data.data.allProjects.projects.forEach(project => {
+       assertCondition(project);
+     });
+   });
+ }
+ testAcceptDonationOnBase('should return projects, filter by accept donation on base', async () => {
+   await saveProjectDirectlyToDb({ ...createProjectData(), title: String(new Date().getTime()), slug: String(new Date().getTime()), networkId: NETWORK_IDS.BASE_MAINNET });
+ }, project => {
+   assert.isOk(project.addresses.find(address => address.isRecipient === true && (address.networkId === NETWORK_IDS.BASE_MAINNET || address.networkId === NETWORK_IDS.BASE_SEPOLIA) && address.chainType === ChainType.EVM));
+ });

Committable suggestion was skipped due low confidence.


it('should return projects, filter by accept donation on mainnet', async () => {
const savedProject = await saveProjectDirectlyToDb({
...createProjectData(),
Expand Down
5 changes: 5 additions & 0 deletions src/resolvers/projectResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,11 @@ export class ProjectResolver {
networkIds.push(NETWORK_IDS.ARBITRUM_SEPOLIA);
return;

case FilterField.AcceptFundOnBase:
networkIds.push(NETWORK_IDS.BASE_MAINNET);
networkIds.push(NETWORK_IDS.BASE_SEPOLIA);
return;

case FilterField.AcceptFundOnPolygon:
networkIds.push(NETWORK_IDS.POLYGON);
return;
Expand Down
10 changes: 10 additions & 0 deletions src/resolvers/projectVerificationFormResolver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,16 @@ function updateProjectVerificationFormMutationTestCases() {
networkId: NETWORK_IDS.ARBITRUM_SEPOLIA,
title: 'test title',
},
{
address: generateRandomEtheriumAddress(),
networkId: NETWORK_IDS.BASE_MAINNET,
title: 'test title',
},
{
address: generateRandomEtheriumAddress(),
networkId: NETWORK_IDS.BASE_SEPOLIA,
title: 'test title',
},
{
address: generateRandomEtheriumAddress(),
networkId: NETWORK_IDS.ETC,
Expand Down
2 changes: 2 additions & 0 deletions src/server/adminJs/tabs/donationTab.ts
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,8 @@ export const donationTab = {
{ value: NETWORK_IDS.CELO_ALFAJORES, label: 'Alfajores' },
{ value: NETWORK_IDS.ARBITRUM_MAINNET, label: 'Arbitrum' },
{ value: NETWORK_IDS.ARBITRUM_SEPOLIA, label: 'Arbitrum Sepolia' },
{ value: NETWORK_IDS.BASE_MAINNET, label: 'Base' },
{ value: NETWORK_IDS.BASE_SEPOLIA, label: 'Base Sepolia' },
],
isVisible: {
list: true,
Expand Down
2 changes: 2 additions & 0 deletions src/server/adminJs/tabs/qfRoundTab.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ const availableNetworkValues = [
},
{ value: NETWORK_IDS.ARBITRUM_MAINNET, label: 'ARBITRUM MAINNET' },
{ value: NETWORK_IDS.ARBITRUM_SEPOLIA, label: 'ARBITRUM SEPOLIA' },
{ value: NETWORK_IDS.BASE_MAINNET, label: 'BASE MAINNET' },
{ value: NETWORK_IDS.BASE_SEPOLIA, label: 'BASE SEPOLIA' },
{ value: NETWORK_IDS.XDAI, label: 'XDAI' },
{ value: NETWORK_IDS.BSC, label: 'BSC' },
];
Expand Down
2 changes: 2 additions & 0 deletions src/server/adminJs/tabs/tokenTab.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,8 @@ export const generateTokenTab = async () => {
},
{ value: NETWORK_IDS.ARBITRUM_MAINNET, label: 'ARBITRUM MAINNET' },
{ value: NETWORK_IDS.ARBITRUM_SEPOLIA, label: 'ARBITRUM SEPOLIA' },
{ value: NETWORK_IDS.BASE_MAINNET, label: 'BASE MAINNET' },
{ value: NETWORK_IDS.BASE_SEPOLIA, label: 'BASE SEPOLIA' },
{ value: NETWORK_IDS.XDAI, label: 'XDAI' },
{ value: NETWORK_IDS.BSC, label: 'BSC' },
{ value: NETWORK_IDS.ETC, label: 'Ethereum Classic' },
Expand Down
Loading
Loading