Commit be950a9f authored by tom goriunov's avatar tom goriunov Committed by GitHub

Merge pull request #1152 from blockscout/tom2drum/issue-972

Add support for custom favicon
parents 1865d9c3 93b99c59
...@@ -81,7 +81,7 @@ RUN yarn build ...@@ -81,7 +81,7 @@ RUN yarn build
# ***************************** # *****************************
# Production image, copy all the files and run next # Production image, copy all the files and run next
FROM node:18-alpine AS runner FROM node:18-alpine AS runner
RUN apk add --no-cache --upgrade bash RUN apk add --no-cache --upgrade bash curl jq unzip
### APP ### APP
WORKDIR /app WORKDIR /app
...@@ -98,9 +98,18 @@ COPY --from=builder /app/package.json ./package.json ...@@ -98,9 +98,18 @@ COPY --from=builder /app/package.json ./package.json
COPY --from=builder /envs-validator/index.js ./envs-validator.js COPY --from=builder /envs-validator/index.js ./envs-validator.js
COPY --from=builder /app/deploy/tools/feature-reporter/index.js ./feature-reporter.js COPY --from=builder /app/deploy/tools/feature-reporter/index.js ./feature-reporter.js
# Copy scripts and ENVs file # Copy scripts
## Entripoint
COPY --chmod=+x ./deploy/scripts/entrypoint.sh . COPY --chmod=+x ./deploy/scripts/entrypoint.sh .
## ENV replacer
COPY --chmod=+x ./deploy/scripts/replace_envs.sh . COPY --chmod=+x ./deploy/scripts/replace_envs.sh .
## Favicon generator
COPY --chmod=+x ./deploy/scripts/favicon_generator.sh .
COPY ./deploy/tools/favicon-generator ./deploy/tools/favicon-generator
RUN ["chmod", "-R", "777", "./deploy/tools/favicon-generator"]
RUN ["chmod", "-R", "777", "./public"]
# Copy ENVs files
COPY --from=builder /app/.env.production . COPY --from=builder /app/.env.production .
COPY --from=builder /app/.env . COPY --from=builder /app/.env .
......
...@@ -6,6 +6,14 @@ if [ $? != 0 ]; then ...@@ -6,6 +6,14 @@ if [ $? != 0 ]; then
echo 🛑 ENV integrity check failed. 1>&2 && exit 1 echo 🛑 ENV integrity check failed. 1>&2 && exit 1
fi fi
# Generate favicons bundle
./favicon_generator.sh
if [ $? -ne 0 ]; then
echo "👎 Unable to generate favicons bundle."
else
echo "👍 Favicons bundle successfully generated."
fi
# Execute script for replace build-time ENVs placeholders with their values at runtime # Execute script for replace build-time ENVs placeholders with their values at runtime
./replace_envs.sh ./replace_envs.sh
......
#!/bin/bash
master_url="${NEXT_PUBLIC_FAVICON_MASTER_URL:-$NEXT_PUBLIC_NETWORK_ICON}"
export MASTER_URL="$master_url"
cd ./deploy/tools/favicon-generator
./script.sh
if [ $? -ne 0 ]; then
cd ../../../
exit 1
else
cd ../../../
favicon_folder="./public/favicon/"
echo "⏳ Replacing default favicons with freshly generated pack..."
if [ -d "$favicon_folder" ]; then
rm -r "$favicon_folder"
fi
mkdir -p "$favicon_folder"
cp -r ./deploy/tools/favicon-generator/output/* "$favicon_folder"
fi
\ No newline at end of file
/output
config.json
response.json
favicon_package**
\ No newline at end of file
{
"favicon_generation": {
"api_key": "<api_key>",
"master_picture": {
"type": "url",
"url": "<master_url>"
},
"files_location": {
"type": "path",
"path": "/favicons"
},
"favicon_design": {
"desktop_browser": {},
"ios": {
"picture_aspect": "no_change",
"assets": {
"ios6_and_prior_icons": false,
"ios7_and_later_icons": true,
"precomposed_icons": false,
"declare_only_default_icon": true
}
},
"safari_pinned_tab": {
"picture_aspect": "black_and_white",
"threshold": 60
}
},
"settings": {
"compression": "3",
"scaling_algorithm": "Mitchell",
"error_on_image_too_small": true,
"readme_file": false,
"html_code_file": false,
"use_path_as_is": false
},
"versioning": {
"param_name": "ver",
"param_value": "15Zd8"
}
}
}
\ No newline at end of file
#!/bin/bash
echo "🌀 Generating favicons bundle..."
# Check if MASTER_URL is provided
if [ -z "$MASTER_URL" ]; then
echo "🛑 Error: MASTER_URL variable is not provided."
exit 1
fi
# Check if NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY is provided
if [ -z "$NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY" ]; then
echo "🛑 Error: NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY variable is not provided."
exit 1
fi
# Mask the NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY to display only the first 8 characters
API_KEY_MASKED="${NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY:0:8}***"
echo "🆗 The following variables are provided:"
echo " MASTER_URL: $MASTER_URL"
echo " NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY: $API_KEY_MASKED"
echo
# RealFaviconGenerator API endpoint URL
API_URL="https://realfavicongenerator.net/api/favicon"
# Target folder for the downloaded assets
TARGET_FOLDER="./output"
# Path to the config JSON template file
CONFIG_TEMPLATE_FILE="config.template.json"
# Path to the generated config JSON file
CONFIG_FILE="config.json"
# Replace <api_key> and <master_url> placeholders in the JSON template file
API_KEY_VALUE="$NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY"
sed -e "s|<api_key>|$API_KEY_VALUE|" -e "s|<master_url>|$MASTER_URL|" "$CONFIG_TEMPLATE_FILE" > "$CONFIG_FILE"
# Make the API POST request with JSON data from the config file
echo "⏳ Making request to API..."
API_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d @"$CONFIG_FILE" "$API_URL")
# Create the response.json file with the API response
echo "$API_RESPONSE" > response.json
# Check if the API response is valid JSON and contains success status
if ! jq -e '.favicon_generation_result.result.status == "success"' <<< "$API_RESPONSE" >/dev/null; then
echo "🛑 Error: API response does not contain the expected structure or has an error status."
ERROR_MESSAGE=$(echo "$API_RESPONSE" | jq -r '.favicon_generation_result.result.error_message' | tr -d '\\')
if [ -n "$ERROR_MESSAGE" ]; then
echo "🛑 $ERROR_MESSAGE"
fi
exit 1
fi
echo "🆗 API responded with success status."
# Parse the JSON response to extract the file URL and remove backslashes
FILE_URL=$(echo "$API_RESPONSE" | jq -r '.favicon_generation_result.favicon.package_url' | tr -d '\\')
PREVIEW_URL=$(echo "$API_RESPONSE" | jq -r '.favicon_generation_result.preview_picture_url' | tr -d '\\')
# Check if FILE_URL is empty
if [ -z "$FILE_URL" ]; then
echo "🛑 File URL not found in JSON response."
exit 1
fi
echo "🆗 Found following file URL in the response: $FILE_URL"
echo "🆗 Favicon preview URL: $PREVIEW_URL"
echo
# Generate a filename based on the URL
FILE_NAME=$(basename "$FILE_URL")
# Check if the target folder exists and clear its contents if it does
if [ -d "$TARGET_FOLDER" ]; then
rm -r "$TARGET_FOLDER"
fi
mkdir -p "$TARGET_FOLDER"
# Download the file
echo "⏳ Trying to download the file..."
curl -s -L "$FILE_URL" -o "$FILE_NAME"
# Check if the download was successful
if [ $? -eq 0 ]; then
echo "🆗 File downloaded successfully."
echo
else
echo "🛑 Error: Failed to download the file."
exit 1
fi
# Unzip the downloaded file to the target folder
echo "⏳ Unzipping the file..."
unzip -q "$FILE_NAME" -d "$TARGET_FOLDER"
# Check if the unzip operation was successful
if [ $? -eq 0 ]; then
echo "🆗 File unzipped successfully."
echo
else
echo "🛑 Failed to unzip the file."
exit 1
fi
# Clean up - remove the JSON response file and temporary JSON config file
rm response.json "$CONFIG_FILE"
echo "✅ Done."
\ No newline at end of file
...@@ -200,3 +200,4 @@ frontend: ...@@ -200,3 +200,4 @@ frontend:
envFromSecret: envFromSecret:
NEXT_PUBLIC_AUTH0_CLIENT_ID: ref+vault://deployment-values/blockscout/dev/l2-optimism-goerli?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_AUTH0_CLIENT_ID NEXT_PUBLIC_AUTH0_CLIENT_ID: ref+vault://deployment-values/blockscout/dev/l2-optimism-goerli?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_AUTH0_CLIENT_ID
NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: ref+vault://deployment-values/blockscout/dev/l2-optimism-goerli?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: ref+vault://deployment-values/blockscout/dev/l2-optimism-goerli?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID
NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY: ref+vault://deployment-values/blockscout/common?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY
...@@ -166,3 +166,4 @@ frontend: ...@@ -166,3 +166,4 @@ frontend:
NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID: ref+vault://deployment-values/blockscout/dev/front-main?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID: ref+vault://deployment-values/blockscout/dev/front-main?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID
NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY: ref+vault://deployment-values/blockscout/dev/front-main?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY: ref+vault://deployment-values/blockscout/dev/front-main?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY
NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: ref+vault://deployment-values/blockscout/dev/front-main?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: ref+vault://deployment-values/blockscout/dev/front-main?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID
NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY: ref+vault://deployment-values/blockscout/common?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY
...@@ -24,6 +24,7 @@ frontend: ...@@ -24,6 +24,7 @@ frontend:
- "/account" - "/account"
- "/apps" - "/apps"
- "/static" - "/static"
- "/favicon"
- "/auth/profile" - "/auth/profile"
- "/auth/unverified-email" - "/auth/unverified-email"
- "/txs" - "/txs"
...@@ -143,3 +144,5 @@ frontend: ...@@ -143,3 +144,5 @@ frontend:
_default: ref+vault://deployment-values/blockscout/dev/review-l2?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY _default: ref+vault://deployment-values/blockscout/dev/review-l2?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY
NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID:
_default: ref+vault://deployment-values/blockscout/dev/review-l2?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID _default: ref+vault://deployment-values/blockscout/dev/review-l2?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID
NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY:
_default: ref+vault://deployment-values/blockscout/common?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY
...@@ -23,6 +23,7 @@ frontend: ...@@ -23,6 +23,7 @@ frontend:
- "/account" - "/account"
- "/apps" - "/apps"
- "/static" - "/static"
- "/favicon"
- "/auth/profile" - "/auth/profile"
- "/auth/unverified-email" - "/auth/unverified-email"
- "/txs" - "/txs"
...@@ -77,6 +78,10 @@ frontend: ...@@ -77,6 +78,10 @@ frontend:
_default: 'true' _default: 'true'
NEXT_PUBLIC_FEATURED_NETWORKS: NEXT_PUBLIC_FEATURED_NETWORKS:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/eth-goerli.json _default: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/eth-goerli.json
NEXT_PUBLIC_NETWORK_LOGO:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/goerli.svg
NEXT_PUBLIC_NETWORK_ICON:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/goerli.svg
NEXT_PUBLIC_API_HOST: NEXT_PUBLIC_API_HOST:
_default: blockscout-main.k8s-dev.blockscout.com _default: blockscout-main.k8s-dev.blockscout.com
NEXT_PUBLIC_STATS_API_HOST: NEXT_PUBLIC_STATS_API_HOST:
...@@ -123,5 +128,7 @@ frontend: ...@@ -123,5 +128,7 @@ frontend:
_default: ref+vault://deployment-values/blockscout/dev/review?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY _default: ref+vault://deployment-values/blockscout/dev/review?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY
NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID:
_default: ref+vault://deployment-values/blockscout/dev/review?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID _default: ref+vault://deployment-values/blockscout/dev/review?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID
NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY:
_default: ref+vault://deployment-values/blockscout/common?token_env=VAULT_TOKEN&address=https://vault.k8s.blockscout.com#/NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY
NEXT_PUBLIC_WEB3_WALLETS: NEXT_PUBLIC_WEB3_WALLETS:
_default: "['token_pocket','coinbase','metamask']" _default: "['token_pocket','coinbase','metamask']"
...@@ -12,6 +12,7 @@ The app instance could be customized by passing following variables to NodeJS en ...@@ -12,6 +12,7 @@ The app instance could be customized by passing following variables to NodeJS en
- [Homepage](ENVS.md#homepage) - [Homepage](ENVS.md#homepage)
- [Sidebar](ENVS.md#sidebar) - [Sidebar](ENVS.md#sidebar)
- [Footer](ENVS.md#footer) - [Footer](ENVS.md#footer)
- [Favicon](ENVS.md#favicon)
- [Views](ENVS.md#views) - [Views](ENVS.md#views)
- [Block](ENVS.md#block-views) - [Block](ENVS.md#block-views)
- [Misc](ENVS.md#misc) - [Misc](ENVS.md#misc)
...@@ -132,6 +133,17 @@ The app version shown in the footer is derived from build-time ENV variables `NE ...@@ -132,6 +133,17 @@ The app version shown in the footer is derived from build-time ENV variables `NE
&nbsp; &nbsp;
### Favicon
By default, the app has generic favicon. You can override this behavior by providing the following variables. Hence, the favicon assets bundle will be generated at the container start time and will be used instead of default one.
| Variable | Type| Description | Compulsoriness | Default value | Example value |
| --- | --- | --- | --- | --- | --- |
| NEXT_PUBLIC_FAVICON_GENERATOR_API_KEY | `string` | RealFaviconGenerator [API key](https://realfavicongenerator.net/api/) | Required | - | `<your-secret>` |
| NEXT_PUBLIC_FAVICON_MASTER_URL | `string` | - | - | `NEXT_PUBLIC_NETWORK_ICON` | `https://placekitten.com/180/180` |
&nbsp;
### Views ### Views
#### Block views #### Block views
......
...@@ -25,7 +25,8 @@ ...@@ -25,7 +25,8 @@
"test:pw:docker": "docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.35.1-focal ./playwright/run-tests.sh", "test:pw:docker": "docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.35.1-focal ./playwright/run-tests.sh",
"test:pw:ci": "yarn test:pw --project=$PW_PROJECT", "test:pw:ci": "yarn test:pw --project=$PW_PROJECT",
"test:jest": "jest", "test:jest": "jest",
"test:jest:watch": "jest --watch" "test:jest:watch": "jest --watch",
"favicon:generate:dev": "./tools/scripts/favicon-generator.dev.sh"
}, },
"dependencies": { "dependencies": {
"@chakra-ui/react": "2.7.1", "@chakra-ui/react": "2.7.1",
......
...@@ -30,6 +30,7 @@ class MyDocument extends Document { ...@@ -30,6 +30,7 @@ class MyDocument extends Document {
return ( return (
<Html lang="en"> <Html lang="en">
<Head> <Head>
{ /* FONTS */ }
<link <link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet" rel="stylesheet"
...@@ -38,10 +39,15 @@ class MyDocument extends Document { ...@@ -38,10 +39,15 @@ class MyDocument extends Document {
href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap"
rel="stylesheet" rel="stylesheet"
/> />
<link rel="icon" sizes="32x32" type="image/png" href="/static/favicon-32x32.png"/>
<link rel="icon" sizes="16x16" type="image/png"href="/static/favicon-16x16.png"/> { /* FAVICON */ }
<link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png"/> <link rel="icon" href="/favicon/favicon.ico" sizes="48x48"/>
<link rel="mask-icon" href="/static/safari-pinned-tab.svg" color="#5bbad5"/> <link rel="icon" sizes="32x32" type="image/png" href="/favicon/favicon-32x32.png"/>
<link rel="icon" sizes="16x16" type="image/png"href="/favicon/favicon-16x16.png"/>
<link rel="apple-touch-icon" href="/favicon/apple-touch-icon-180x180.png"/>
<link rel="mask-icon" href="/favicon/safari-pinned-tab.svg"/>
{ /* OG TAGS */ }
<meta property="og:title" content="Blockscout: A block explorer designed for a decentralized world."/> <meta property="og:title" content="Blockscout: A block explorer designed for a decentralized world."/>
<meta <meta
property="og:description" property="og:description"
......
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180">
<path d="M34.9 2.9c-2.9 2.9-2.9 3-2.9 15 0 6.8-.5 13.1-1.1 14.5-1.9 4-6.6 5.6-16.6 5.6C4.7 38 1.7 39.4.5 44.3.2 45.5.1 75.4.2 110.7l.3 64.2 2.3 2.3c2.1 2.1 3.3 2.3 14.6 2.6 14.8.4 17.9-.6 19.5-6.6.7-2.4 1.1-26.2 1.1-66.9V43.1l2.4-2.8c2.3-2.7 2.9-2.8 13.6-3.3 15-.7 15-.6 15-18.2v-13l-2.9-2.9C63.2 0 63.2 0 50.5 0S37.8 0 34.9 2.9zM111.8 1.5c-3.9 2.2-5.1 7.8-4.6 20.4.5 9.8.6 10.6 3.2 12.8 2.3 2 3.8 2.3 10.5 2.3 4.3 0 9.2.5 11 1.1 6.3 2.2 6.1.3 6.1 71.4v64.7l2.9 2.9c2.9 2.9 3 2.9 15.4 2.9 12 0 12.7-.1 15.6-2.6l3.1-2.6V42.9l-2.5-2.4c-2.2-2.2-3.2-2.5-10.5-2.5-8.1 0-14-1.6-15.6-4.1-.5-.8-1.1-7.6-1.4-15.1C144.3.3 144.6.6 127.2.2c-9.8-.1-13.3.1-15.4 1.3zM72.3 74.4l-2.8 2.4-.3 30.6-.3 30.5 3 3.3 2.9 3.3h13.1c12.9 0 13.1 0 15.8-2.8l2.8-2.7V76.8l-2.8-2.4C101 72.1 100.2 72 88 72s-13 .1-15.7 2.4z"/>
</svg>
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 700">
<path d="M149.7 1.1c-11.6 2.8-22.3 13.4-25.4 25-.3 1.3-.7 22-.9 45.9-.3 48.7-.5 50.7-7.3 59.6-4.5 6-10.2 10.1-17.2 12.3-4.6 1.5-9.6 1.8-35.4 1.9-16.5 0-32 .3-34.5.7-12.4 1.8-23.8 12-27.4 24.6C.1 176 0 200.6.2 425l.3 248.5 2.6 5.6c3.7 7.9 9 13.3 16.7 17.1l6.7 3.3h94l5.5-2.6c7.3-3.4 13.6-9.9 17.4-17.9l3.1-6.5.1-248c0-136.4.4-249.6.8-251.5 2.1-8.8 9.9-19.1 17.6-23 7.4-3.8 11.6-4.2 42.5-4.2 33.9.1 38.7-.6 47.1-6.3 5.3-3.7 9.9-9.3 13-16 1.7-3.7 1.9-7.7 2.1-47 .2-28.1-.1-44.9-.8-48.5-2.1-10.7-9.6-20.1-19.8-24.9L243.5.5l-45-.2c-24.7-.1-46.7.3-48.8.8zM444.2 1c-10 2.4-18.8 9.9-23.6 20l-3 6.5-.1 43.5c-.1 30.3.2 44.9 1 48 2.8 10.8 9.2 18.5 19.5 23.4l6.5 3.1 30.2.2c30.8.2 35.2.7 42.5 4.4 7.8 4 15.3 13.8 17.4 22.9.4 1.9.8 114.6.9 250.5.1 183.2.4 248 1.3 251 2.6 9.1 10.1 17.7 19.2 22.3l5.5 2.7 45.1.3c43.9.3 45.3.3 51.5-1.8 10.9-3.7 19.1-12.1 22.3-23 1.5-5 1.7-26.6 1.6-252.8 0-243.1 0-247.3-2-252.8-3.4-9.9-11.5-18-21.5-21.5-5.1-1.8-8.7-2-36.3-2.2-28.9-.3-31-.5-36.3-2.5-7.3-2.9-15.2-10.4-18.7-17.9l-2.7-5.8L564 73l-.5-46.5-2.6-5.6c-3.7-7.9-9-13.3-16.7-17.1L537.5.5l-45-.2c-24.7-.1-46.5.2-48.3.7zM296.5 280c-12.4 2.9-21.9 11.6-25.9 23.6-1.5 4.7-1.7 14.9-1.7 117.6 0 111.4 0 112.6 2.1 118.1 4.3 11.4 14.1 20 25.4 22.4 4.3.8 84 1 89.7.2 14.3-2.2 26.5-14.6 28.6-29.1 1-6.5.8-220.9-.1-225.8-1.8-8.9-8.2-17.9-16.1-22.6-9.1-5.3-10.6-5.4-56.5-5.3-23.4.1-43.8.5-45.5.9z"/>
</svg>
secrets_file="./configs/envs/.env.secrets"
favicon_folder="./public/favicon/"
master_url="https://raw.githubusercontent.com/blockscout/frontend/main/tools/scripts/favicon.svg"
if [ ! -f "$secrets_file" ]; then
echo "Error: File '$secrets_file' not found."
exit 1
fi
dotenv \
-v MASTER_URL=$master_url \
-e $secrets_file \
-- bash -c 'cd ./deploy/tools/favicon-generator && ./script.sh'
if [ -d "$favicon_folder" ]; then
rm -r "$favicon_folder"
fi
mkdir -p "$favicon_folder"
cp -r ./deploy/tools/favicon-generator/output/* "$favicon_folder"
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 30 30">
<path fill="#2B6CB0" fill-rule="evenodd" d="M12.703 5.6a1.6 1.6 0 0 0-1.6-1.6H9.575a1.6 1.6 0 0 0-1.6 1.6v1.383a1.6 1.6 0 0 1-1.6 1.6H5.6a1.6 1.6 0 0 0-1.6 1.6V24.4A1.6 1.6 0 0 0 5.6 26h1.528a1.6 1.6 0 0 0 1.6-1.6V10.183a1.6 1.6 0 0 1 1.6-1.6h.775a1.6 1.6 0 0 0 1.6-1.6V5.6Zm9.487 0a1.6 1.6 0 0 0-1.6-1.6h-1.528a1.6 1.6 0 0 0-1.6 1.6v1.383a1.6 1.6 0 0 0 1.6 1.6h.61a1.6 1.6 0 0 1 1.6 1.6V24.4a1.6 1.6 0 0 0 1.6 1.6H24.4a1.6 1.6 0 0 0 1.6-1.6V10.183a1.6 1.6 0 0 0-1.6-1.6h-.61a1.6 1.6 0 0 1-1.6-1.6V5.6Zm-4.793 8.774a1.6 1.6 0 0 0-1.6-1.6h-1.528a1.6 1.6 0 0 0-1.6 1.6v5.705a1.6 1.6 0 0 0 1.6 1.6h1.528a1.6 1.6 0 0 0 1.6-1.6v-5.705Z" clip-rule="evenodd"/>
</svg>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment