Skip to content

Commit cd27e8f

Browse files
authored
Zilliqa: filter for Scilla contracts (blockscout#2449)
* Zilliqa: filter for Scilla contracts Fixes blockscout#2427 * [skip ci] review fixes
1 parent 196a4b8 commit cd27e8f

File tree

8 files changed

+49
-13
lines changed

8 files changed

+49
-13
lines changed

configs/app/ui/views/address.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import type { VerifiedContractsFilter } from 'types/api/contracts';
12
import type { SmartContractVerificationMethodExtra } from 'types/client/contract';
2-
import { SMART_CONTRACT_EXTRA_VERIFICATION_METHODS } from 'types/client/contract';
3+
import { SMART_CONTRACT_EXTRA_VERIFICATION_METHODS, SMART_CONTRACT_LANGUAGE_FILTERS } from 'types/client/contract';
34
import type { AddressFormat, AddressViewId, IdenticonType } from 'types/views/address';
45
import { ADDRESS_FORMATS, ADDRESS_VIEWS_IDS, IDENTICON_TYPES } from 'types/views/address';
56

@@ -58,9 +59,20 @@ const extraVerificationMethods: Array<SmartContractVerificationMethodExtra> = ((
5859
return SMART_CONTRACT_EXTRA_VERIFICATION_METHODS;
5960
}
6061

61-
const parsedMethods = parseEnvJson<Array<SmartContractVerificationMethodExtra>>(getEnvValue('NEXT_PUBLIC_VIEWS_CONTRACT_EXTRA_VERIFICATION_METHODS')) || [];
62+
const parsedMethods = parseEnvJson<Array<SmartContractVerificationMethodExtra>>(envValue) || [];
6263

63-
return SMART_CONTRACT_EXTRA_VERIFICATION_METHODS.filter((method) => parsedMethods.includes(method));
64+
return parsedMethods.filter((method) => SMART_CONTRACT_EXTRA_VERIFICATION_METHODS.includes(method));
65+
})();
66+
67+
const languageFilters: Array<VerifiedContractsFilter> = (() => {
68+
const envValue = parseEnvJson<Array<VerifiedContractsFilter>>(getEnvValue('NEXT_PUBLIC_VIEWS_CONTRACT_LANGUAGE_FILTERS'));
69+
if (!envValue) {
70+
// "Scilla" is chain specific language, so we don't want to show it in default scenario
71+
const DEFAULT_LANGUAGE_FILTERS = SMART_CONTRACT_LANGUAGE_FILTERS.filter((filter) => filter !== 'scilla');
72+
return DEFAULT_LANGUAGE_FILTERS;
73+
}
74+
75+
return envValue.filter((filter) => SMART_CONTRACT_LANGUAGE_FILTERS.includes(filter));
6476
})();
6577

6678
const config = Object.freeze({
@@ -72,6 +84,7 @@ const config = Object.freeze({
7284
hiddenViews,
7385
solidityscanEnabled: getEnvValue('NEXT_PUBLIC_VIEWS_CONTRACT_SOLIDITYSCAN_ENABLED') === 'true',
7486
extraVerificationMethods,
87+
languageFilters,
7588
});
7689

7790
export default config;

configs/envs/.env.zilliqa_prototestnet

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ NEXT_PUBLIC_APP_PORT=3000
99
NEXT_PUBLIC_APP_ENV=development
1010
NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL=ws
1111

12-
NEXT_PUBLIC_VIEWS_ADDRESS_FORMAT=['bech32','base16']
13-
NEXT_PUBLIC_VIEWS_ADDRESS_BECH_32_PREFIX=zil
14-
NEXT_PUBLIC_VIEWS_BLOCK_HIDDEN_FIELDS=['base_fee']
12+
NEXT_PUBLIC_VIEWS_CONTRACT_LANGUAGE_FILTERS=['solidity','vyper','yul','scilla']
13+
1514

1615
# Instance ENVs
1716
NEXT_PUBLIC_API_BASE_PATH=/
@@ -20,7 +19,7 @@ NEXT_PUBLIC_API_SPEC_URL=https://raw.githubusercontent.com/blockscout/blockscout
2019
NEXT_PUBLIC_CONTRACT_CODE_IDES=[{'title':'Remix IDE','url':'https://remix.ethereum.org/?address={hash}&blockscout={domain}','icon_url':'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/ide-icons/remix.png'}]
2120
NEXT_PUBLIC_GRAPHIQL_TRANSACTION=0x3d1ded3a7924cd3256a4b1a447c9bfb194f54b9a8ceb441edb8bb01563b516db
2221
NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs']
23-
NEXT_PUBLIC_HOMEPAGE_HERO_BANNER_CONFIG={'background':['linear-gradient(90deg, rgba(52,103, 109, 1) 0.06%, rgba(105, 181, 172, 1) 99.97%)'],'text_color':['rgba(255, 255, 255, 1)']}
22+
NEXT_PUBLIC_HOMEPAGE_HERO_BANNER_CONFIG={'background':['linear-gradient(90deg, rgba(0, 208, 198, 1) 0.06%, rgba(43, 146, 151, 1) 99.97%)','linear-gradient(90deg, rgba(0, 208, 198, 1) 0.06%, rgba(43, 146, 151, 1) 50.02%, rgba(0, 0, 0, 1) 99.97%)'],'text_color':['rgba(255, 255, 255, 1)','rgba(255, 255, 255, 1)'],'button':{'_default':{'background':['rgba(38, 6, 124, 1)']},'_hover':{'background':['rgba(17, 4, 87, 1)']}}}
2423
NEXT_PUBLIC_IS_TESTNET=true
2524
NEXT_PUBLIC_METADATA_SERVICE_API_HOST=https://metadata.services.blockscout.com
2625
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS=18
@@ -36,6 +35,7 @@ NEXT_PUBLIC_NETWORK_RPC_URL=https://api.zq2-prototestnet.zilliqa.com
3635
NEXT_PUBLIC_NETWORK_SHORT_NAME=Zilliqa EVM proto-testnet
3736
NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true
3837
NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/zilliqa.png
39-
NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY=6Ld0iT8aAAAAAJdju0CmAwGjW7JTDvIw-Q5pwt5T
4038
NEXT_PUBLIC_TRANSACTION_INTERPRETATION_PROVIDER=blockscout
39+
NEXT_PUBLIC_VIEWS_ADDRESS_BECH_32_PREFIX=zil
40+
NEXT_PUBLIC_VIEWS_ADDRESS_FORMAT=["base16", "bech32"]
4141
NEXT_PUBLIC_VISUALIZE_API_HOST=https://visualizer.services.blockscout.com

deploy/tools/envs-validator/schema.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type { AdButlerConfig } from '../../../types/client/adButlerConfig';
1313
import type { AddressProfileAPIConfig } from '../../../types/client/addressProfileAPIConfig';
1414
import { SUPPORTED_AD_TEXT_PROVIDERS, SUPPORTED_AD_BANNER_PROVIDERS, SUPPORTED_AD_BANNER_ADDITIONAL_PROVIDERS } from '../../../types/client/adProviders';
1515
import type { AdTextProviders, AdBannerProviders, AdBannerAdditionalProviders } from '../../../types/client/adProviders';
16-
import { SMART_CONTRACT_EXTRA_VERIFICATION_METHODS, type ContractCodeIde, type SmartContractVerificationMethodExtra } from '../../../types/client/contract';
16+
import { SMART_CONTRACT_EXTRA_VERIFICATION_METHODS, SMART_CONTRACT_LANGUAGE_FILTERS, type ContractCodeIde, type SmartContractVerificationMethodExtra } from '../../../types/client/contract';
1717
import type { DeFiDropdownItem } from '../../../types/client/deFiDropdown';
1818
import type { GasRefuelProviderConfig } from '../../../types/client/gasRefuelProviderConfig';
1919
import { GAS_UNITS } from '../../../types/client/gasTracker';
@@ -42,6 +42,7 @@ import type { BlockFieldId } from '../../../types/views/block';
4242
import type { NftMarketplaceItem } from '../../../types/views/nft';
4343
import type { TxAdditionalFieldsId, TxFieldsId } from '../../../types/views/tx';
4444
import { TX_ADDITIONAL_FIELDS_IDS, TX_FIELDS_IDS } from '../../../types/views/tx';
45+
import type { VerifiedContractsFilter } from '../../../types/api/contracts';
4546

4647
import { replaceQuotes } from '../../../configs/app/utils';
4748
import * as regexp from '../../../lib/regexp';
@@ -719,6 +720,12 @@ const schema = yup
719720

720721
return isNoneSchema.isValidSync(data) || isArrayOfMethodsSchema.isValidSync(data);
721722
}),
723+
NEXT_PUBLIC_VIEWS_CONTRACT_LANGUAGE_FILTERS: yup
724+
.array()
725+
.transform(replaceQuotes)
726+
.json()
727+
.of(yup.string<VerifiedContractsFilter>().oneOf(SMART_CONTRACT_LANGUAGE_FILTERS)),
728+
722729
NEXT_PUBLIC_VIEWS_TX_HIDDEN_FIELDS: yup
723730
.array()
724731
.transform(replaceQuotes)

deploy/tools/envs-validator/test/.env.base

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ NEXT_PUBLIC_VIEWS_ADDRESS_IDENTICON_TYPE=gradient_avatar
7474
NEXT_PUBLIC_VIEWS_ADDRESS_FORMAT=['base16']
7575
NEXT_PUBLIC_VIEWS_ADDRESS_HIDDEN_VIEWS=['top_accounts']
7676
NEXT_PUBLIC_VIEWS_CONTRACT_EXTRA_VERIFICATION_METHODS=['solidity-hardhat','solidity-foundry']
77+
NEXT_PUBLIC_VIEWS_CONTRACT_LANGUAGE_FILTERS=['solidity','vyper','yul','scilla']
7778
NEXT_PUBLIC_VIEWS_BLOCK_HIDDEN_FIELDS=['burnt_fees','total_reward']
7879
NEXT_PUBLIC_VIEWS_NFT_MARKETPLACES=[{'name':'NFT Marketplace','collection_url':'https://example.com/{hash}','instance_url':'https://example.com/{hash}/{id}','logo_url':'https://example.com/logo.png'}]
7980
NEXT_PUBLIC_VIEWS_TX_ADDITIONAL_FIELDS=['fee_per_gas']

docs/ENVS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ Settings for meta tags, OG tags and SEO
243243
| NEXT_PUBLIC_VIEWS_ADDRESS_HIDDEN_VIEWS | `Array<AddressViewId>` | Address views that should not be displayed. See below the list of the possible id values. | - | - | `'["top_accounts"]'` | v1.15.0+ |
244244
| NEXT_PUBLIC_VIEWS_CONTRACT_SOLIDITYSCAN_ENABLED | `boolean` | Set to `true` if SolidityScan reports are supported | - | - | `true` | v1.19.0+ |
245245
| NEXT_PUBLIC_VIEWS_CONTRACT_EXTRA_VERIFICATION_METHODS | `Array<'solidity-hardhat' \| 'solidity-foundry'>` | Pass an array of additional methods from which users can choose while verifying a smart contract. Both methods are available by default, pass `'none'` string to disable them all. | - | - | `['solidity-hardhat']` | v1.33.0+ |
246+
| NEXT_PUBLIC_VIEWS_CONTRACT_LANGUAGE_FILTERS | `Array<'solidity' \| 'vyper' \| 'yul' \| 'scilla'>` | Pass an array of contract languages that will be displayed as options in the filter on the verified contract page. | - | `['solidity','vyper','yul']` | `['solidity','vyper','yul','scilla']` | v1.37.0+ |
246247

247248
##### Address views list
248249
| Id | Description |

types/api/contracts.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ export interface VerifiedContractsResponse {
2424
} | null;
2525
}
2626

27+
export type VerifiedContractsFilter = 'solidity' | 'vyper' | 'yul' | 'scilla';
28+
2729
export interface VerifiedContractsFilters {
2830
q: string | undefined;
29-
filter: 'vyper' | 'solidity' | 'yul' | undefined;
31+
filter: VerifiedContractsFilter | undefined;
3032
}
3133

3234
export type VerifiedContractsCounters = {

types/client/contract.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { SmartContractLicenseType, SmartContractVerificationConfigRaw, SmartContractVerificationMethodApi } from 'types/api/contract';
2+
import type { VerifiedContractsFilter } from 'types/api/contracts';
23

34
export interface ContractCodeIde {
45
title: string;
@@ -25,3 +26,10 @@ export type SmartContractVerificationMethod = SmartContractVerificationMethodApi
2526
export interface SmartContractVerificationConfig extends SmartContractVerificationConfigRaw {
2627
verification_options: Array<SmartContractVerificationMethod>;
2728
}
29+
30+
export const SMART_CONTRACT_LANGUAGE_FILTERS: Array<VerifiedContractsFilter> = [
31+
'solidity',
32+
'vyper',
33+
'yul',
34+
'scilla',
35+
];

ui/verifiedContracts/VerifiedContractsFilter.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
import React from 'react';
22

3-
import type { VerifiedContractsFilters } from 'types/api/contracts';
3+
import type { VerifiedContractsFilter as TVerifiedContractsFilter } from 'types/api/contracts';
44

5+
import config from 'configs/app';
56
import PopoverFilterRadio from 'ui/shared/filters/PopoverFilterRadio';
67

8+
type OptionValue = TVerifiedContractsFilter | 'all';
9+
710
const OPTIONS = [
811
{ value: 'all', label: 'All' },
912
{ value: 'solidity', label: 'Solidity' },
1013
{ value: 'vyper', label: 'Vyper' },
1114
{ value: 'yul', label: 'Yul' },
12-
];
15+
{ value: 'scilla', label: 'Scilla' },
16+
].filter(({ value }) => value === 'all' || config.UI.views.address.languageFilters.includes(value)) as Array<{ value: OptionValue; label: string }>;
1317

1418
interface Props {
1519
hasActiveFilter: boolean;
16-
defaultValue: VerifiedContractsFilters['filter'] | undefined;
20+
defaultValue: TVerifiedContractsFilter | undefined;
1721
onChange: (nextValue: string | Array<string>) => void;
1822
}
1923

0 commit comments

Comments
 (0)