From c716a14059cf04410249c48e342dcf4a2e27c09e Mon Sep 17 00:00:00 2001 From: isstuev Date: Tue, 17 Sep 2024 09:32:28 +0200 Subject: [PATCH 1/5] add filecoin envs --- configs/envs/.env.arbitrum | 2 +- configs/envs/.env.arbitrum_nova | 2 +- configs/envs/.env.base | 2 +- configs/envs/.env.celo_alfajores | 2 +- configs/envs/.env.eth | 2 +- configs/envs/.env.eth_sepolia | 2 +- configs/envs/.env.filecoin | 42 +++++++++++++++++++++++++++++ configs/envs/.env.gnosis | 2 +- configs/envs/.env.main | 2 +- configs/envs/.env.optimism | 2 +- configs/envs/.env.optimism_celestia | 2 +- configs/envs/.env.optimism_sepolia | 2 +- configs/envs/.env.polygon | 2 +- configs/envs/.env.rootstock_testnet | 2 +- configs/envs/.env.stability_testnet | 2 +- configs/envs/.env.zkevm | 2 +- configs/envs/.env.zksync | 2 +- tools/preset-sync/index.ts | 3 ++- 18 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 configs/envs/.env.filecoin diff --git a/configs/envs/.env.arbitrum b/configs/envs/.env.arbitrum index a1ec2fef59..1fc81ce901 100644 --- a/configs/envs/.env.arbitrum +++ b/configs/envs/.env.arbitrum @@ -1,6 +1,6 @@ # Set of ENVs for Arbitrum One network explorer # https://arbitrum.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=arbitrum" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=arbitrum" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.arbitrum_nova b/configs/envs/.env.arbitrum_nova index c07ded0b8a..2888565d7d 100644 --- a/configs/envs/.env.arbitrum_nova +++ b/configs/envs/.env.arbitrum_nova @@ -1,6 +1,6 @@ # Set of ENVs for Arbitrum One network explorer # https://arbitrum.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=arbitrum" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=arbitrum" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.base b/configs/envs/.env.base index 9003326a81..8eab44c966 100644 --- a/configs/envs/.env.base +++ b/configs/envs/.env.base @@ -1,6 +1,6 @@ # Set of ENVs for Base Mainnet network explorer # https://base.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=base" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=base" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.celo_alfajores b/configs/envs/.env.celo_alfajores index 2934345c90..01d1bf4c13 100644 --- a/configs/envs/.env.celo_alfajores +++ b/configs/envs/.env.celo_alfajores @@ -1,6 +1,6 @@ # Set of ENVs for Celo Alfajores network explorer # https://celo-alfajores.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=celo_alfajores" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=celo_alfajores" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.eth b/configs/envs/.env.eth index 42a4639b87..781a15d702 100644 --- a/configs/envs/.env.eth +++ b/configs/envs/.env.eth @@ -1,6 +1,6 @@ # Set of ENVs for Ethereum network explorer # https://eth.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=eth" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=eth" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.eth_sepolia b/configs/envs/.env.eth_sepolia index 46b25eddf3..9299600d29 100644 --- a/configs/envs/.env.eth_sepolia +++ b/configs/envs/.env.eth_sepolia @@ -1,6 +1,6 @@ # Set of ENVs for Sepolia network explorer # https://eth-sepolia.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=eth_sepolia" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=eth_sepolia" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.filecoin b/configs/envs/.env.filecoin new file mode 100644 index 0000000000..0f6e05cd25 --- /dev/null +++ b/configs/envs/.env.filecoin @@ -0,0 +1,42 @@ +# Set of ENVs for Filecoin Virtual Machine network explorer +# https://filecoin.blockscout.com +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=filecoin" + +# Local ENVs +NEXT_PUBLIC_APP_PROTOCOL=http +NEXT_PUBLIC_APP_HOST=localhost +NEXT_PUBLIC_APP_PORT=3000 +NEXT_PUBLIC_APP_ENV=development +NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL=ws + +# Instance ENVs +NEXT_PUBLIC_API_BASE_PATH=/ +NEXT_PUBLIC_API_HOST=filecoin.blockscout.com +NEXT_PUBLIC_API_SPEC_URL=https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml +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'}] +NEXT_PUBLIC_FOOTER_LINKS=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/footer-links/fvm.json +NEXT_PUBLIC_GRAPHIQL_TRANSACTION=0x5abb6212c1802402b828ed20c2bd4d4a6153b8bee68a5259cba3c8d7a7c6b775 +NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs', 'coin_price', 'market_cap'] +NEXT_PUBLIC_HOMEPAGE_PLATE_BACKGROUND=linear-gradient(237deg, rgb(26, 58, 150) 14.83%, rgb(111, 223, 164) 132.56%) +NEXT_PUBLIC_HOMEPAGE_PLATE_TEXT_COLOR=rgba(255, 255, 255, 1) +NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true +NEXT_PUBLIC_LOGOUT_URL=https://blockscout-filecoin.us.auth0.com/v2/logout +NEXT_PUBLIC_MARKETPLACE_ENABLED=false +NEXT_PUBLIC_METADATA_SERVICE_API_HOST=https://metadata.services.blockscout.com +NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS=18 +NEXT_PUBLIC_NETWORK_CURRENCY_NAME=FIL +NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=FIL +NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'GeckoTerminal','logo':'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/explorer-logos/geckoterminal.png','baseUrl':'https://www.geckoterminal.com/','paths':{'token':'/filecoin/pools'}}] +NEXT_PUBLIC_NETWORK_ICON=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/filecoin-icon-dark.svg +NEXT_PUBLIC_NETWORK_ICON_DARK=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/filecoin-icon-light.svg +NEXT_PUBLIC_NETWORK_ID=314 +NEXT_PUBLIC_NETWORK_LOGO=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/filecoin-logo-dark.svg +NEXT_PUBLIC_NETWORK_LOGO_DARK=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/filecoin-logo-light.svg +NEXT_PUBLIC_NETWORK_NAME=Filecoin Virtual Machine +NEXT_PUBLIC_NETWORK_RPC_URL=https://rpc.ankr.com/filecoin +NEXT_PUBLIC_NETWORK_SHORT_NAME=Filecoin Virtual Machine +NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true +NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/filecoin.png +NEXT_PUBLIC_STATS_API_HOST=https://stats-filecoin.k8s-prod-1.blockscout.com +NEXT_PUBLIC_TRANSACTION_INTERPRETATION_PROVIDER=blockscout +NEXT_PUBLIC_VISUALIZE_API_HOST=https://visualizer.services.blockscout.com \ No newline at end of file diff --git a/configs/envs/.env.gnosis b/configs/envs/.env.gnosis index dead77d742..7e1d1e6993 100644 --- a/configs/envs/.env.gnosis +++ b/configs/envs/.env.gnosis @@ -1,6 +1,6 @@ # Set of ENVs for Gnosis chain network explorer # https://gnosis.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=gnosis" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=gnosis" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.main b/configs/envs/.env.main index e9d31eedb2..0568827c78 100644 --- a/configs/envs/.env.main +++ b/configs/envs/.env.main @@ -1,6 +1,6 @@ # Set of ENVs for Sepolia network explorer # https://eth-sepolia.k8s-dev.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=main" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=main" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.optimism b/configs/envs/.env.optimism index 45f46dc01e..8fd9911afc 100644 --- a/configs/envs/.env.optimism +++ b/configs/envs/.env.optimism @@ -1,6 +1,6 @@ # Set of ENVs for OP Mainnet network explorer # https://optimism.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=optimism" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=optimism" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.optimism_celestia b/configs/envs/.env.optimism_celestia index cb66ee2c0b..650975e1c1 100644 --- a/configs/envs/.env.optimism_celestia +++ b/configs/envs/.env.optimism_celestia @@ -1,6 +1,6 @@ # Set of ENVs for OP Celestia Raspberry network explorer # https://opcelestia-raspberry.gelatoscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=optimism_celestia" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=optimism_celestia" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.optimism_sepolia b/configs/envs/.env.optimism_sepolia index 8636924480..146b064965 100644 --- a/configs/envs/.env.optimism_sepolia +++ b/configs/envs/.env.optimism_sepolia @@ -1,6 +1,6 @@ # Set of ENVs for OP Sepolia network explorer # https://optimism-sepolia.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=optimism_sepolia" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=optimism_sepolia" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.polygon b/configs/envs/.env.polygon index 4fe0631ac0..ddd94291fc 100644 --- a/configs/envs/.env.polygon +++ b/configs/envs/.env.polygon @@ -1,6 +1,6 @@ # Set of ENVs for Polygon Mainnet network explorer # https://polygon.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=polygon" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=polygon" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.rootstock_testnet b/configs/envs/.env.rootstock_testnet index a4218a2fac..06368491ef 100644 --- a/configs/envs/.env.rootstock_testnet +++ b/configs/envs/.env.rootstock_testnet @@ -1,6 +1,6 @@ # Set of ENVs for Rootstock Testnet network explorer # https://rootstock-testnet.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=rootstock_testnet" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=rootstock_testnet" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.stability_testnet b/configs/envs/.env.stability_testnet index c057fda27c..e96ca8462d 100644 --- a/configs/envs/.env.stability_testnet +++ b/configs/envs/.env.stability_testnet @@ -1,6 +1,6 @@ # Set of ENVs for Stability Testnet network explorer # https://stability-testnet.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=stability_testnet" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=stability_testnet" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.zkevm b/configs/envs/.env.zkevm index 8b7dc2e566..65db320a6b 100644 --- a/configs/envs/.env.zkevm +++ b/configs/envs/.env.zkevm @@ -1,6 +1,6 @@ # Set of ENVs for Polygon zkEVM network explorer # https://zkevm.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=zkevm" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=zkevm" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/configs/envs/.env.zksync b/configs/envs/.env.zksync index 0638d13b80..f7b18c0548 100644 --- a/configs/envs/.env.zksync +++ b/configs/envs/.env.zksync @@ -1,6 +1,6 @@ # Set of ENVs for ZkSync Era network explorer # https://zksync.blockscout.com -# This is an auto-generated file. To update all values, run "yarn preset:sync --name=zksync" +# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=zksync" # Local ENVs NEXT_PUBLIC_APP_PROTOCOL=http diff --git a/tools/preset-sync/index.ts b/tools/preset-sync/index.ts index ab19ee3469..3c61bfdcbe 100755 --- a/tools/preset-sync/index.ts +++ b/tools/preset-sync/index.ts @@ -11,6 +11,7 @@ const PRESETS = { eth_goerli: 'https://eth-goerli.blockscout.com', eth_sepolia: 'https://eth-sepolia.blockscout.com', garnet: 'https://explorer.garnetchain.com', + filecoin: 'https://filecoin.blockscout.com', gnosis: 'https://gnosis.blockscout.com', optimism: 'https://optimism.blockscout.com', optimism_celestia: 'https://opcelestia-raspberry.gelatoscout.com', @@ -75,7 +76,7 @@ function updateFileContent(envsEntries: Array<[ string, string ]>, presetId: key const content = `# Set of ENVs for ${ chainName } network explorer\n` + '# ' + explorerUrl + '\n' + - `# This is an auto-generated file. To update all values, run "yarn preset:sync --name=${ presetId }"\n` + + `# This is an auto-generated file. To update all values, run "yarn dev:preset:sync --name=${ presetId }"\n` + '\n' + '# Local ENVs\n' + localEnvsContent + '\n' + From 89af39c6501a453bba4f3b31b50ab25fbce93c0f Mon Sep 17 00:00:00 2001 From: isstuev Date: Tue, 17 Sep 2024 13:41:41 +0200 Subject: [PATCH 2/5] filecoin addresses support --- mocks/address/address.ts | 9 ++++ types/api/address.ts | 25 ++++++++++ types/api/addressParams.ts | 2 + ui/address/AddressDetails.pw.tsx | 23 +++++++++ ui/address/AddressDetails.tsx | 47 ++++++++++++++++++ ...dressDetails.pw.tsx_default_filecoin-1.png | Bin 0 -> 45536 bytes ...tails.pw.tsx_default_mobile-filecoin-1.png | Bin 0 -> 41467 bytes ui/address/filecoin/FilecoinActorTag.tsx | 39 +++++++++++++++ ui/pages/Address.tsx | 11 +++- ui/shared/entities/address/AddressEntity.tsx | 6 +-- .../VerifiedContractsListItem.tsx | 4 +- .../VerifiedContractsTableItem.tsx | 4 +- 12 files changed, 161 insertions(+), 9 deletions(-) create mode 100644 ui/address/__screenshots__/AddressDetails.pw.tsx_default_filecoin-1.png create mode 100644 ui/address/__screenshots__/AddressDetails.pw.tsx_default_mobile-filecoin-1.png create mode 100644 ui/address/filecoin/FilecoinActorTag.tsx diff --git a/mocks/address/address.ts b/mocks/address/address.ts index e58097c2f5..112f774ba0 100644 --- a/mocks/address/address.ts +++ b/mocks/address/address.ts @@ -157,3 +157,12 @@ export const validator: Address = { watchlist_address_id: null, ens_domain_name: null, }; + +export const filecoin = { + ...validator, + filecoin: { + actor_type: 'evm' as const, + id: 'f02977693', + robust: 'f410fuiwj6a3yxajbohrl5vu6ns6o2e2jriul52lvzci', + }, +}; diff --git a/types/api/address.ts b/types/api/address.ts index 733350cc93..3d38e65d86 100644 --- a/types/api/address.ts +++ b/types/api/address.ts @@ -14,6 +14,7 @@ export interface Address extends UserTags { creation_tx_hash: string | null; exchange_rate: string | null; ens_domain_name: string | null; + filecoin?: AddressFilecoinParams; // TODO: if we are happy with tabs-counters method, should we delete has_something fields? has_beacon_chain_withdrawals?: boolean; has_decompiled_code: boolean; @@ -268,3 +269,27 @@ export type AddressEpochRewardsItem = { epoch_number: number; associated_account: AddressParam; } + +export type AddressFilecoinParams = { + actor_type: FilecoinActorType; + id: string; + robust: string; +} + +export type FilecoinActorType = + 'account' | + 'cron' | + 'datacap' | + 'eam' | + 'ethaccount' | + 'evm' | + 'init' | + 'market' | + 'miner' | + 'multisig' | + 'paych' | + 'placeholder' | + 'power' | + 'reward' | + 'system' | + 'verifreg'; diff --git a/types/api/addressParams.ts b/types/api/addressParams.ts index 069302e808..4b82507154 100644 --- a/types/api/addressParams.ts +++ b/types/api/addressParams.ts @@ -1,3 +1,4 @@ +import type { AddressFilecoinParams } from './address'; import type { AddressMetadataTagApi } from './addressMetadata'; export interface AddressImplementation { @@ -33,6 +34,7 @@ export type AddressParamBasic = { reputation: number | null; tags: Array; } | null; + filecoin?: AddressFilecoinParams; } export type AddressParam = UserTags & AddressParamBasic; diff --git a/ui/address/AddressDetails.pw.tsx b/ui/address/AddressDetails.pw.tsx index 7d49ae723d..9c7a14917d 100644 --- a/ui/address/AddressDetails.pw.tsx +++ b/ui/address/AddressDetails.pw.tsx @@ -44,6 +44,17 @@ test.describe('mobile', () => { }); }); + test('filecoin', async({ render, mockApiResponse, page }) => { + await mockApiResponse('address', addressMock.filecoin, { pathParams: { hash: ADDRESS_HASH } }); + await mockApiResponse('address_counters', countersMock.forValidator, { pathParams: { hash: ADDRESS_HASH } }); + + const component = await render(, { hooksConfig }); + + await expect(component).toHaveScreenshot({ + mask: [ page.locator(pwConfig.adsBannerSelector) ], + maskColor: pwConfig.maskColor, + }); + }); }); test('contract', async({ render, page, mockApiResponse }) => { @@ -92,3 +103,15 @@ test('validator', async({ render, mockApiResponse, page }) => { maskColor: pwConfig.maskColor, }); }); + +test('filecoin', async({ render, mockApiResponse, page }) => { + await mockApiResponse('address', addressMock.filecoin, { pathParams: { hash: ADDRESS_HASH } }); + await mockApiResponse('address_counters', countersMock.forValidator, { pathParams: { hash: ADDRESS_HASH } }); + + const component = await render(, { hooksConfig }); + + await expect(component).toHaveScreenshot({ + mask: [ page.locator(pwConfig.adsBannerSelector) ], + maskColor: pwConfig.maskColor, + }); +}); diff --git a/ui/address/AddressDetails.tsx b/ui/address/AddressDetails.tsx index e781f5b519..47d0a7dec3 100644 --- a/ui/address/AddressDetails.tsx +++ b/ui/address/AddressDetails.tsx @@ -10,18 +10,21 @@ import getQueryParamString from 'lib/router/getQueryParamString'; import AddressCounterItem from 'ui/address/details/AddressCounterItem'; import ServiceDegradationWarning from 'ui/shared/alerts/ServiceDegradationWarning'; import isCustomAppError from 'ui/shared/AppError/isCustomAppError'; +import CopyToClipboard from 'ui/shared/CopyToClipboard'; import DataFetchAlert from 'ui/shared/DataFetchAlert'; import * as DetailsInfoItem from 'ui/shared/DetailsInfoItem'; import DetailsSponsoredItem from 'ui/shared/DetailsSponsoredItem'; import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import BlockEntity from 'ui/shared/entities/block/BlockEntity'; import TxEntity from 'ui/shared/entities/tx/TxEntity'; +import HashStringShortenDynamic from 'ui/shared/HashStringShortenDynamic'; import AddressBalance from './details/AddressBalance'; import AddressImplementations from './details/AddressImplementations'; import AddressNameInfo from './details/AddressNameInfo'; import AddressNetWorth from './details/AddressNetWorth'; import AddressSaveOnGas from './details/AddressSaveOnGas'; +import FilecoinActorTag from './filecoin/FilecoinActorTag'; import TokenSelect from './tokenSelect/TokenSelect'; import useAddressCountersQuery from './utils/useAddressCountersQuery'; import type { AddressQuery } from './utils/useAddressQuery'; @@ -63,6 +66,7 @@ const AddressDetails = ({ addressQuery, scrollRef }: Props) => { has_tokens: true, has_token_transfers: true, has_validated_blocks: false, + filecoin: undefined, }), [ addressHash ]); // error handling (except 404 codes) @@ -91,6 +95,49 @@ const AddressDetails = ({ addressQuery, scrollRef }: Props) => { rowGap={{ base: 1, lg: 3 }} templateColumns={{ base: 'minmax(0, 1fr)', lg: 'auto minmax(0, 1fr)' }} overflow="hidden" > + { data.filecoin?.id && ( + <> + + ID + + + { data.filecoin.id } + + + + ) } + + { data.filecoin?.actor_type && ( + <> + + Actor + + + + + + ) } + + { (data.filecoin?.actor_type === 'evm' || data.filecoin?.actor_type === 'ethaccount') && data?.filecoin?.robust && ( + <> + + Ethereum Address + + + + + + + + + ) } + { data.is_contract && data.creation_tx_hash && data.creator_address_hash && ( diff --git a/ui/address/__screenshots__/AddressDetails.pw.tsx_default_filecoin-1.png b/ui/address/__screenshots__/AddressDetails.pw.tsx_default_filecoin-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d657ae1500a6f9d6c6c29b348a9f587d5c1e6dd0 GIT binary patch literal 45536 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 bk6GElXP%UG$PI#V-gB6?;gurI>kt0}yGPGn literal 0 HcmV?d00001 diff --git a/ui/address/__screenshots__/AddressDetails.pw.tsx_default_mobile-filecoin-1.png b/ui/address/__screenshots__/AddressDetails.pw.tsx_default_mobile-filecoin-1.png new file mode 100644 index 0000000000000000000000000000000000000000..27606137f4eec5e21fb1937682b2f87d0f3c1278 GIT binary patch literal 41467 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 = { + account: 'Account', + cron: 'Scheduled Tasks', + datacap: 'Data Cap Management', + eam: 'Ethereum Address Manager', + ethaccount: 'Ethereum-Compatible Account', + evm: 'Ethereum Virtual Machine', + init: 'Initialization', + market: 'Storage Market', + miner: 'Storage Provider', + multisig: 'Multi-Signature Wallet', + paych: 'Payment Channel', + placeholder: 'Placeholder Address', + power: 'Power Management', + reward: 'Incentives and Rewards', + system: 'System Operations', + verifreg: 'Verification Registry', +}; + +type Props = { + actorType: FilecoinActorType; +} + +const FilecoinActorTag = ({ actorType }: Props) => { + const text = ACTOR_TYPES[actorType]; + + if (!text) { + return null; + } + + return { text }; +}; + +export default FilecoinActorTag; diff --git a/ui/pages/Address.tsx b/ui/pages/Address.tsx index 854a364e63..dd55271750 100644 --- a/ui/pages/Address.tsx +++ b/ui/pages/Address.tsx @@ -346,7 +346,14 @@ const AddressPageContent = () => { /> ) } { { !isLoading && !addressQuery.data?.is_contract && config.features.account.isEnabled && ( ) } - + { !isLoading && addressQuery.data?.is_contract && addressQuery.data?.is_verified && config.UI.views.address.solidityscanEnabled && diff --git a/ui/shared/entities/address/AddressEntity.tsx b/ui/shared/entities/address/AddressEntity.tsx index 514100ecf1..e36eb5b0bf 100644 --- a/ui/shared/entities/address/AddressEntity.tsx +++ b/ui/shared/entities/address/AddressEntity.tsx @@ -77,7 +77,7 @@ const Icon = (props: IconProps) => { ); @@ -115,7 +115,7 @@ const Content = chakra((props: ContentProps) => { return ( ); }); @@ -126,7 +126,7 @@ const Copy = (props: CopyProps) => { return ( ); }; diff --git a/ui/verifiedContracts/VerifiedContractsListItem.tsx b/ui/verifiedContracts/VerifiedContractsListItem.tsx index fe64a1fb05..8f47008d9d 100644 --- a/ui/verifiedContracts/VerifiedContractsListItem.tsx +++ b/ui/verifiedContracts/VerifiedContractsListItem.tsx @@ -47,9 +47,9 @@ const VerifiedContractsListItem = ({ data, isLoading }: Props) => { { data.certified && } - + - + Balance { currencyUnits.ether } diff --git a/ui/verifiedContracts/VerifiedContractsTableItem.tsx b/ui/verifiedContracts/VerifiedContractsTableItem.tsx index 0282dea6ca..2771a07f55 100644 --- a/ui/verifiedContracts/VerifiedContractsTableItem.tsx +++ b/ui/verifiedContracts/VerifiedContractsTableItem.tsx @@ -46,9 +46,9 @@ const VerifiedContractsTableItem = ({ data, isLoading }: Props) => { - + - + From fef3aa38ab44023c7dbf9d3c89342e5172e20c60 Mon Sep 17 00:00:00 2001 From: isstuev Date: Thu, 24 Oct 2024 13:27:08 +0200 Subject: [PATCH 3/5] add more robust addresses --- types/api/address.ts | 7 ++++--- types/api/contract.ts | 1 + types/api/search.ts | 4 ++++ types/api/token.ts | 1 + ui/address/AddressDetails.tsx | 8 ++++++-- ui/address/contract/alerts/ContractDetailsAlerts.tsx | 2 +- ui/searchResults/SearchResultListItem.tsx | 9 ++++++--- ui/searchResults/SearchResultTableItem.tsx | 9 ++++++--- .../SearchBarSuggest/SearchBarSuggestAddress.tsx | 2 +- .../SearchBarSuggest/SearchBarSuggestDomain.tsx | 2 +- .../searchBar/SearchBarSuggest/SearchBarSuggestLabel.tsx | 2 +- .../searchBar/SearchBarSuggest/SearchBarSuggestToken.tsx | 2 +- ui/tokenInstance/details/TokenInstanceCreatorAddress.tsx | 3 +++ ui/tokens/TokensListItem.tsx | 3 ++- ui/tokens/TokensTableItem.tsx | 4 ++++ 15 files changed, 42 insertions(+), 17 deletions(-) diff --git a/types/api/address.ts b/types/api/address.ts index 3d38e65d86..9d316f81c3 100644 --- a/types/api/address.ts +++ b/types/api/address.ts @@ -11,6 +11,7 @@ export interface Address extends UserTags { block_number_balance_updated_at: number | null; coin_balance: string | null; creator_address_hash: string | null; + creator_filecoin_robust_address?: string | null; creation_tx_hash: string | null; exchange_rate: string | null; ens_domain_name: string | null; @@ -271,9 +272,9 @@ export type AddressEpochRewardsItem = { } export type AddressFilecoinParams = { - actor_type: FilecoinActorType; - id: string; - robust: string; + actor_type?: FilecoinActorType; + id?: string | null; + robust?: string | null; } export type FilecoinActorType = diff --git a/types/api/contract.ts b/types/api/contract.ts index f1e937d866..8ae7cbd9d5 100644 --- a/types/api/contract.ts +++ b/types/api/contract.ts @@ -67,6 +67,7 @@ export interface SmartContract { remappings?: Array; }; verified_twin_address_hash: string | null; + verified_twin_filecoin_robust_address?: string | null; proxy_type: SmartContractProxyType | null; language: string | null; license_type: SmartContractLicenseType | null; diff --git a/types/api/search.ts b/types/api/search.ts index 7d738e7cbd..7572c60060 100644 --- a/types/api/search.ts +++ b/types/api/search.ts @@ -15,6 +15,7 @@ export interface SearchResultToken { total_supply: string | null; is_verified_via_admin_panel: boolean; is_smart_contract_verified: boolean; + filecoin_robust_address?: string | null; } export interface SearchResultAddressOrContract { @@ -23,6 +24,7 @@ export interface SearchResultAddressOrContract { address: string; is_smart_contract_verified: boolean; certified?: true; + filecoin_robust_address?: string | null; url?: string; // not used by the frontend, we build the url ourselves ens_info?: { address_hash: string; @@ -36,6 +38,7 @@ export interface SearchResultDomain { type: 'ens_domain'; name: string | null; address: string; + filecoin_robust_address?: string | null; is_smart_contract_verified: boolean; url?: string; // not used by the frontend, we build the url ourselves ens_info: { @@ -49,6 +52,7 @@ export interface SearchResultDomain { export interface SearchResultLabel { type: 'label'; address: string; + filecoin_robust_address?: string | null; name: string; is_smart_contract_verified: boolean; url?: string; // not used by the frontend, we build the url ourselves diff --git a/types/api/token.ts b/types/api/token.ts index 58d4e484fb..c321667b57 100644 --- a/types/api/token.ts +++ b/types/api/token.ts @@ -20,6 +20,7 @@ export interface TokenInfo { bridge_type?: string | null; origin_chain_id?: string | null; foreign_address?: string | null; + filecoin_robust_address?: string | null; } export interface TokenCounters { diff --git a/ui/address/AddressDetails.tsx b/ui/address/AddressDetails.tsx index 47d0a7dec3..5d56228eda 100644 --- a/ui/address/AddressDetails.tsx +++ b/ui/address/AddressDetails.tsx @@ -67,6 +67,8 @@ const AddressDetails = ({ addressQuery, scrollRef }: Props) => { has_token_transfers: true, has_validated_blocks: false, filecoin: undefined, + creator_filecoin_robust_address: null, + creator_address_hash: null, }), [ addressHash ]); // error handling (except 404 codes) @@ -87,6 +89,8 @@ const AddressDetails = ({ addressQuery, scrollRef }: Props) => { return null; } + const creatorAddressHash = data.creator_address_hash; + return ( <> { addressQuery.isDegradedData && } @@ -140,7 +144,7 @@ const AddressDetails = ({ addressQuery, scrollRef }: Props) => { - { data.is_contract && data.creation_tx_hash && data.creator_address_hash && ( + { data.is_contract && data.creation_tx_hash && (creatorAddressHash) && ( <> { diff --git a/ui/address/contract/alerts/ContractDetailsAlerts.tsx b/ui/address/contract/alerts/ContractDetailsAlerts.tsx index ed040c94a1..cf71876d79 100644 --- a/ui/address/contract/alerts/ContractDetailsAlerts.tsx +++ b/ui/address/contract/alerts/ContractDetailsAlerts.tsx @@ -72,7 +72,7 @@ const ContractDetailsAlerts = ({ data, isLoading, addressHash, channel }: Props) Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB { const shouldHighlightHash = ADDRESS_REGEXP.test(searchTerm); const address = { hash: data.address, + filecoin: { + robust: data.filecoin_robust_address, + }, is_contract: data.type === 'contract', is_verified: data.is_smart_contract_verified, name: null, @@ -288,7 +291,7 @@ const SearchResultListItem = ({ data, searchTerm, isLoading }: Props) => { - + { data.is_smart_contract_verified && } @@ -333,7 +336,7 @@ const SearchResultListItem = ({ data, searchTerm, isLoading }: Props) => { return ( - + { data.is_smart_contract_verified && } @@ -384,7 +387,7 @@ const SearchResultListItem = ({ data, searchTerm, isLoading }: Props) => { return ( - + { data.ens_info.names_count > 1 ? diff --git a/ui/searchResults/SearchResultTableItem.tsx b/ui/searchResults/SearchResultTableItem.tsx index ae24e3e7d2..5b13563aca 100644 --- a/ui/searchResults/SearchResultTableItem.tsx +++ b/ui/searchResults/SearchResultTableItem.tsx @@ -77,7 +77,7 @@ const SearchResultTableItem = ({ data, searchTerm, isLoading }: Props) => { - + { data.is_smart_contract_verified && } @@ -100,6 +100,9 @@ const SearchResultTableItem = ({ data, searchTerm, isLoading }: Props) => { const addressName = data.name || data.ens_info?.name; const address = { hash: data.address, + filecoin: { + robust: data.filecoin_robust_address, + }, is_contract: data.type === 'contract', is_verified: data.is_smart_contract_verified, name: null, @@ -174,7 +177,7 @@ const SearchResultTableItem = ({ data, searchTerm, isLoading }: Props) => { - + { data.is_smart_contract_verified && } @@ -392,7 +395,7 @@ const SearchResultTableItem = ({ data, searchTerm, isLoading }: Props) => { - + { data.is_smart_contract_verified && } diff --git a/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestAddress.tsx b/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestAddress.tsx index ef22025c2e..4304e095de 100644 --- a/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestAddress.tsx +++ b/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestAddress.tsx @@ -52,7 +52,7 @@ const SearchBarSuggestAddress = ({ data, isMobile, searchTerm }: Props) => { { data.certified && } ); - const addressEl = ; + const addressEl = ; if (isMobile) { return ( diff --git a/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestDomain.tsx b/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestDomain.tsx index 2ec60ccc8d..37b2de65b1 100644 --- a/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestDomain.tsx +++ b/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestDomain.tsx @@ -34,7 +34,7 @@ const SearchBarSuggestDomain = ({ data, isMobile, searchTerm }: Props) => { whiteSpace="nowrap" variant="secondary" > - + ); diff --git a/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestLabel.tsx b/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestLabel.tsx index 1e1ffcadb9..dbb98005b4 100644 --- a/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestLabel.tsx +++ b/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestLabel.tsx @@ -33,7 +33,7 @@ const SearchBarSuggestLabel = ({ data, isMobile, searchTerm }: Props) => { whiteSpace="nowrap" variant="secondary" > - + ); diff --git a/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestToken.tsx b/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestToken.tsx index 67e31f239c..78d23f9f78 100644 --- a/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestToken.tsx +++ b/ui/snippets/searchBar/SearchBarSuggest/SearchBarSuggestToken.tsx @@ -30,7 +30,7 @@ const SearchBarSuggestToken = ({ data, isMobile, searchTerm }: Props) => { const address = ( - + ); diff --git a/ui/tokenInstance/details/TokenInstanceCreatorAddress.tsx b/ui/tokenInstance/details/TokenInstanceCreatorAddress.tsx index bab4c00800..276fe95010 100644 --- a/ui/tokenInstance/details/TokenInstanceCreatorAddress.tsx +++ b/ui/tokenInstance/details/TokenInstanceCreatorAddress.tsx @@ -28,6 +28,9 @@ const TokenInstanceCreatorAddress = ({ hash }: Props) => { const creatorAddress = { hash: addressQuery.data.creator_address_hash, + filecoin: { + robust: addressQuery.data.creator_filecoin_robust_address, + }, is_contract: false, implementations: null, }; diff --git a/ui/tokens/TokensListItem.tsx b/ui/tokens/TokensListItem.tsx index b0cbfdd352..9ddfa612ba 100644 --- a/ui/tokens/TokensListItem.tsx +++ b/ui/tokens/TokensListItem.tsx @@ -32,6 +32,7 @@ const TokensTableItem = ({ const { address, + filecoin_robust_address: filecoinRobustAddress, exchange_rate: exchangeRate, type, holders, @@ -70,7 +71,7 @@ const TokensTableItem = ({ Date: Thu, 24 Oct 2024 14:12:30 +0200 Subject: [PATCH 4/5] filecoin deploy preset --- .github/workflows/deploy-review-l2.yml | 1 + .github/workflows/deploy-review.yml | 1 + .vscode/tasks.json | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/deploy-review-l2.yml b/.github/workflows/deploy-review-l2.yml index ae88aca961..2ee4dd35e7 100644 --- a/.github/workflows/deploy-review-l2.yml +++ b/.github/workflows/deploy-review-l2.yml @@ -19,6 +19,7 @@ on: - eth - eth_sepolia - eth_goerli + - filecoin - optimism - optimism_celestia - optimism_sepolia diff --git a/.github/workflows/deploy-review.yml b/.github/workflows/deploy-review.yml index 73e3fa08e6..f183ead094 100644 --- a/.github/workflows/deploy-review.yml +++ b/.github/workflows/deploy-review.yml @@ -19,6 +19,7 @@ on: - eth - eth_sepolia - eth_goerli + - filecoin - optimism - optimism_celestia - optimism_sepolia diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1a450a1365..40896494ac 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -367,6 +367,7 @@ "eth", "eth_goerli", "eth_sepolia", + "filecoin", "optimism", "optimism_celestia", "optimism_sepolia", From ef7e99385d1c3477f56b44db744538f869545605 Mon Sep 17 00:00:00 2001 From: isstuev Date: Fri, 25 Oct 2024 12:17:38 +0200 Subject: [PATCH 5/5] couple more robust places --- types/api/address.ts | 26 +------------------ types/api/addressParams.ts | 25 +++++++++++++++++- ui/address/AddressDetails.tsx | 10 +++---- ui/address/filecoin/FilecoinActorTag.tsx | 2 +- ui/pages/Address.tsx | 1 - ui/shared/entities/address/AddressEntity.tsx | 2 +- .../address/AddressEntityContentProxy.tsx | 2 +- 7 files changed, 33 insertions(+), 35 deletions(-) diff --git a/types/api/address.ts b/types/api/address.ts index 9d316f81c3..c20b3eb034 100644 --- a/types/api/address.ts +++ b/types/api/address.ts @@ -1,6 +1,6 @@ import type { Transaction } from 'types/api/transaction'; -import type { UserTags, AddressImplementation, AddressParam } from './addressParams'; +import type { UserTags, AddressImplementation, AddressParam, AddressFilecoinParams } from './addressParams'; import type { Block, EpochRewardsType } from './block'; import type { InternalTransaction } from './internalTransaction'; import type { MudWorldSchema, MudWorldTable } from './mudWorlds'; @@ -270,27 +270,3 @@ export type AddressEpochRewardsItem = { epoch_number: number; associated_account: AddressParam; } - -export type AddressFilecoinParams = { - actor_type?: FilecoinActorType; - id?: string | null; - robust?: string | null; -} - -export type FilecoinActorType = - 'account' | - 'cron' | - 'datacap' | - 'eam' | - 'ethaccount' | - 'evm' | - 'init' | - 'market' | - 'miner' | - 'multisig' | - 'paych' | - 'placeholder' | - 'power' | - 'reward' | - 'system' | - 'verifreg'; diff --git a/types/api/addressParams.ts b/types/api/addressParams.ts index 4b82507154..1ccbd9273f 100644 --- a/types/api/addressParams.ts +++ b/types/api/addressParams.ts @@ -1,4 +1,3 @@ -import type { AddressFilecoinParams } from './address'; import type { AddressMetadataTagApi } from './addressMetadata'; export interface AddressImplementation { @@ -17,6 +16,30 @@ export interface WatchlistName { display_name: string; } +export type AddressFilecoinParams = { + actor_type?: FilecoinActorType; + id?: string | null; + robust?: string | null; +} + +export type FilecoinActorType = + 'account' | + 'cron' | + 'datacap' | + 'eam' | + 'ethaccount' | + 'evm' | + 'init' | + 'market' | + 'miner' | + 'multisig' | + 'paych' | + 'placeholder' | + 'power' | + 'reward' | + 'system' | + 'verifreg'; + export interface UserTags { private_tags: Array | null; watchlist_names: Array | null; diff --git a/ui/address/AddressDetails.tsx b/ui/address/AddressDetails.tsx index 5d56228eda..613f31e74c 100644 --- a/ui/address/AddressDetails.tsx +++ b/ui/address/AddressDetails.tsx @@ -17,7 +17,6 @@ import DetailsSponsoredItem from 'ui/shared/DetailsSponsoredItem'; import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import BlockEntity from 'ui/shared/entities/block/BlockEntity'; import TxEntity from 'ui/shared/entities/tx/TxEntity'; -import HashStringShortenDynamic from 'ui/shared/HashStringShortenDynamic'; import AddressBalance from './details/AddressBalance'; import AddressImplementations from './details/AddressImplementations'; @@ -134,10 +133,11 @@ const AddressDetails = ({ addressQuery, scrollRef }: Props) => { Ethereum Address - - - - + ) } diff --git a/ui/address/filecoin/FilecoinActorTag.tsx b/ui/address/filecoin/FilecoinActorTag.tsx index 55db64fd8b..00af440848 100644 --- a/ui/address/filecoin/FilecoinActorTag.tsx +++ b/ui/address/filecoin/FilecoinActorTag.tsx @@ -1,7 +1,7 @@ import { Tag } from '@chakra-ui/react'; import React from 'react'; -import type { FilecoinActorType } from 'types/api/address'; +import type { FilecoinActorType } from 'types/api/addressParams'; const ACTOR_TYPES: Record = { account: 'Account', diff --git a/ui/pages/Address.tsx b/ui/pages/Address.tsx index dd55271750..6c87ecfd2b 100644 --- a/ui/pages/Address.tsx +++ b/ui/pages/Address.tsx @@ -349,7 +349,6 @@ const AddressPageContent = () => { address={{ ...addressQuery.data, hash: checkSummedHash, - filecoin: addressQuery.data?.filecoin, name: '', ens_domain_name: '', implementations: null, diff --git a/ui/shared/entities/address/AddressEntity.tsx b/ui/shared/entities/address/AddressEntity.tsx index e36eb5b0bf..422929e3f3 100644 --- a/ui/shared/entities/address/AddressEntity.tsx +++ b/ui/shared/entities/address/AddressEntity.tsx @@ -99,7 +99,7 @@ const Content = chakra((props: ContentProps) => { const label = ( { nameText } - { props.address.hash } + { props.address.filecoin?.robust ?? props.address.hash } ); diff --git a/ui/shared/entities/address/AddressEntityContentProxy.tsx b/ui/shared/entities/address/AddressEntityContentProxy.tsx index 66fbb4146f..73039f71cc 100644 --- a/ui/shared/entities/address/AddressEntityContentProxy.tsx +++ b/ui/shared/entities/address/AddressEntityContentProxy.tsx @@ -46,7 +46,7 @@ const AddressEntityContentProxy = (props: ContentProps) => { Proxy contract { props.address.name ? ` (${ props.address.name })` : '' } - + Implementation{ implementations.length > 1 ? 's' : '' } { implementationName ? ` (${ implementationName })` : '' }