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

docs: move verification to tools #1054

Merged
Merged
Show file tree
Hide file tree
Changes from all 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
Binary file added docs/dapp/images/tools/sourcify1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/dapp/images/tools/sourcify2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/dapp/images/tools/sourcify3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 4 additions & 4 deletions docs/dapp/tools/README.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,18 @@ developers using [Remix] (*unencrypted transactions only*), [Sourcify],
[Discord][discord] if you are using a tool that has problems integrating with
Oasis.

[Remix]: remix.md
[Sourcify]: /dapp/sapphire/verification
[Remix]: ./remix.md
[Sourcify]: ./verification.md
[localnet]: ./localnet.mdx
[Band]: ./band.md
[discord]: https://oasis.io/discord

## See also

<DocCardList items={[
findSidebarItem('/dapp/sapphire/verification'),
findSidebarItem('/dapp/tools/abi-playground'),
findSidebarItem('/dapp/tools/verification'),
findSidebarItem('/dapp/tools/localnet'),
findSidebarItem('/dapp/tools/band'),
findSidebarItem('/dapp/tools/remix'),
findSidebarItem('/dapp/tools/abi-playground'),
]} />
4 changes: 2 additions & 2 deletions docs/dapp/tools/abi-playground.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,6 @@ Should you have any other problems or questions, do not hesitate to share them w

[abi-playground]: https://abi-playground.oasis.io/
[Explorer]: https://explorer.oasis.io/
[localnet]: /dapp/tools/localnet
[verification]: /dapp/sapphire/verification
[localnet]: ./localnet.mdx
[verification]: ./verification.md
[discord]: https://oasis.io/discord
143 changes: 143 additions & 0 deletions docs/dapp/tools/verification.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
---
description: Verifying deployed contracts
---

# Contract Verification

[Sourcify] is the preferred service for the [verification of smart
contracts][ethereum-contract-verify] deployed on Sapphire. Make sure you have
the **address of each deployed contract** available (your deployment scripts
should report those) and the **contracts JSON metadata file** generated when
compiling contracts (Hardhat stores it inside the `artifacts/build-info` folder
and names it as a 32-digit hex number). If your project contains multiple
contracts, you will need to verify each contract separately.

:::warning Contract deployment encryption

**Do not deploy your contract with an encrypted contract deployment transaction,
if you want to verify it.** For example, if your `hardhat.config.ts`
or deployment script contains `import '@oasisprotocol/sapphire-hardhat'` or
`import '@oasisprotocol/sapphire-paratime'` lines at the beginning, you should
comment those out for the deployment.

Verification services will try to match the contract deployment transaction code
with the one in the provided contract's metadata. Because the transaction was
encrypted with an ephemeral ParaTime key, the verification service will not be
able to decrypt it. Some services may extract the contract's bytecode from the
chain directly by calling `eth_getCode` RPC, but this will not work correctly
for contracts with immutable variables.

:::

## Verification with Hardhat

If you use Hardhat to deploy your contracts, consider using the
[hardhat-verify] plugin.

To configure it, add the following to your `hardhat.config.ts` file:

```js title="hardhat.config.ts"
etherscan: {
// Enabled by default (not supported on Sapphire)
enabled: false
},
sourcify: {
// Disabled by default
// Doesn't need an API key
enabled: true
}
```

Now you can use the `verify` task:

```shell
pnpm hardhat verify --network sapphire-testnet DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1"
```

[hardhat-verify]: https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify

## Verification with Foundry

[Foundry] natively supports Sourcify verification. To use **Sourcify** as a
provider, specify it with the `--verifier` option.

Example:

```shell
forge verify-contract <address> src/MyToken.sol:MyToken --verifier sourcify
```

:::info
To see all available options and more examples visit the
**[verify-contract page of foundry][foundry-verify]** or the **[sourcify docs]**
:::

[Foundry]: https://book.getfoundry.sh
[foundry-verify]: https://book.getfoundry.sh/reference/forge/forge-verify-contract
[sourcify docs]: https://docs.sourcify.dev/docs/how-to-verify/#foundry

## Verification on Sourcify

To verify maunally a contract deployed on Sapphire Mainnet or Testnet on Sourcify:

1. Visit the [Sourcify] website and hit the "VERIFY CONTRACT" button.

![Sourcify website](../images/tools/sourcify1.png)

2. Upload the contracts JSON metadata file. (Sourcify can parse the Hardhat
.json output file under `artifacts/build-info`)

![Sourcify: Upload metadata JSON file](../images/tools//sourcify2.png)

:::tip Store your metadata files

For production deployments, it is generally a good idea to **archive your
contract metadata JSON file** since it is not only useful for the
verification, but contains a copy of all the source files, produced bytecode,
an ABI, compiler and other relevant contract-related settings that may be
useful in the future. Sourcify will store the metadata file for you and will
even make it available via IPFS, but it is still a good idea to store it
yourself.

:::

3. Sourcify will decode the metadata and prepare a list of included contracts on
the right. Enter the address of the specific contract and select the "Oasis
Sapphire" or "Oasis Sapphire Testnet" chain for Mainnet or Testnet
accordingly. If your contract assigns any immutable variables in the
constructor, you will also need to correctly fill those out under the "More
Inputs (optional)" panel. Finally, click on the "Verify" button.

![Sourcify: Verify contract](../images/tools/sourcify3.png)

4. If everything goes well, you will get a *Perfect match* notice. Your
contract is now verified. Congratulations!

In case of a *Partial match*, the contracts metadata JSON differs from the one
used for deployment although the compiled contract bytecode matched. Make sure
the source code `.sol` file of the contract is the same as the one used during the
deployment (including the comments, variable names and source code file
names) and use the same version of Hardhat and solc compiler.

:::info
You can also explore all verification methods on Sourcify by reading the
[official Sourcify contract verification instructions][sourcify-contract-verify].
:::

[Sourcify]: https://sourcify.dev/
[sourcify-contract-verify]: https://docs.sourcify.dev/docs/how-to-verify/
[ethereum-contract-verify]: https://ethereum.org/en/developers/docs/smart-contracts/verifying/

## Troubleshooting

### Etherscan error with hardhat-verify

- **Cause**: hardhat-verify tries to verify a contract on Etherscan for an unsupported network.
- **Solution**: Disable Etherscan verification with
```
etherscan: {
// Enabled by default (not supported on Sapphire)
enabled: false
},
```

4 changes: 4 additions & 0 deletions redirects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,10 @@ export const redirectsOptions: Options = {
{
to: '/dapp/tools/band',
from: '/dapp/emerald/integrating-band-oracle-smart-contract', // #907 Move Band oracle to Tools section
},
{
to: '/dapp/tools/verification',
from: '/dapp/sapphire/verification', // #1054 Move Sapphire verification to Tools section
}
],
createRedirects(existingPath) {
Expand Down
4 changes: 2 additions & 2 deletions sidebarDapp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ export const sidebarDapp: SidebarsConfig = {
'dapp/sapphire/guide',
'dapp/sapphire/browser',
'dapp/sapphire/authentication',
'dapp/sapphire/verification',
'dapp/sapphire/gasless',
'dapp/sapphire/addresses',
'dapp/sapphire/deployment',
Expand Down Expand Up @@ -123,9 +122,10 @@ export const sidebarDapp: SidebarsConfig = {
},
items: [
'dapp/tools/abi-playground',
'dapp/tools/verification',
'dapp/tools/band',
'dapp/tools/localnet',
'dapp/tools/remix'
'dapp/tools/remix',
],
},
],
Expand Down
Loading