Sourcify's server for verifying contracts.
The server config is defined in src/config/default.js
.
To override the default config, you can create a local.js
file and override the default config. The parameters are overridden one by one, so you only need to override the parameters you want to change.
Or if you are running in a deployment you can pass the NODE_CONFIG_ENV
name as the config file name and it will take precedence. For example, if you are running in a NODE_CONFIG_ENV=staging
environment, you can create a config/staging.js
file and it will be used instead of the default config. Local takes precedence over NODE_CONFIG_ENV
. The file precedence is defined in node-config package.
The chains supported by the Sourcify server are defined in src/sourcify-chains-default.json
.
To support a different set of chains, you can create a src/sourcify-chains.json
file and completely override the default chains.
A full example of a chain entry is as follows:
{
// the chain id
"1": {
"sourcifyName": "Ethereum Mainnet", // required
"supported": true, // required
// optional
"etherscanApi": {
"apiURL": "https://api.etherscan.io",
"apiKeyEnvName": "ETHERSCAN_API_KEY" // the name of the environment variable holding the api key
},
// optional
"fetchContractCreationTxUsing": {
// How to find the transaction hash that created the contract
"etherscanApi": true, // if supported by the new etherscan api. Need to provide the etherscanApi config
"blockscoutApi": {
// blockscout v2 instances have an api endpoint for this
"url": "https://gnosis.blockscout.com/"
},
"blockscoutScrape": {
// scraping from old (server-side rendered) blockscour ui
"url": "https://scan.pulsechain.com/"
},
"avalancheApi": true // avalanche subnets at glacier-api.avax.network have an api endpoint for this
},
// optional. If not provided, the default rpc will be the ones from chains.json i.e. chainid.network/chains.json
"rpc": [
"https://rpc.sepolia.io", // can be a simple url
{
"type": "FetchRequest", // ethers.js FetchRequest for header authenticated RPCs
"url": "https://rpc.mainnet.ethpandaops.io",
"headers": [
{
"headerName": "CF-Access-Client-Id",
"headerEnvName": "CF_ACCESS_CLIENT_ID"
},
{
"headerName": "CF-Access-Client-Secret",
"headerEnvName": "CF_ACCESS_CLIENT_SECRET"
}
]
},
{
"type": "Alchemy", // Alchemy RPCs
"url": "https://eth-mainnet.alchemyapi.io/v2/{ALCHEMY_API_KEY}",
"apiKeyEnvName": "ALCHEMY_API_KEY"
},
{
"type": "Infura", // Infura RPCs
"url": "https://palm-mainnet.infura.io/v3/{INFURA_API_KEY}",
"apiKeyEnvName": "INFURA_API_KEY"
}
]
}
}
- Node.js (v16)
Copy the .env.dev
file into a file named .env
and fill in the values.
npm install
npm start
The containers are published in the Github Container Registry
You can run the server using Docker and pass in a custom sourcify-chains.json
(see above Chains Config) and local.js
(see above Server Config) config file.
Also set up the environment variables in the .env
file. You can see the list of required environment variables in the .env.dev
file. Pass it with the --env-file
flag or use the --env
flag to pass individual environment variables.
$ docker pull ghcr.io/ethereum/sourcify/server:latest
$ docker run \
-p 5555:5555 \
-v path/to/custom/sourcify-chains.json:/home/app/services/server/dist/sourcify-chains.json \
-v path/to/custom/config.js:/home/app/services/server/dist/local.js \
--env-file .env \
ghcr.io/ethereum/sourcify/server:latest