├── .gitignore ├── CONTRIBUTING.md ├── README.md ├── docs ├── antora.yml └── modules │ └── ROOT │ ├── assets │ └── images │ │ ├── access-control-contract.png │ │ ├── access-control.png │ │ ├── action-migration-2.0.png │ │ ├── actions-autotask-faq.png │ │ ├── actions-parallel-workflow.png │ │ ├── actions-start-workflow.png │ │ ├── actions-workflow.png │ │ ├── actions.webm │ │ ├── address-book-faq.png │ │ ├── address-book-migration-1.0.png │ │ ├── address-book-migration-2.0.png │ │ ├── address-book.webm │ │ ├── api-key-expiration-config.png │ │ ├── audit-filter.png │ │ ├── audit-new-issue.png │ │ ├── audit-reply-issue.png │ │ ├── audit-side.png │ │ ├── audit-status.png │ │ ├── audit-trail.png │ │ ├── auto-action-general-info.png │ │ ├── autotasks-migration-1.0.png │ │ ├── code-assets.png │ │ ├── code-report-summary.png │ │ ├── code-settings-advanced.png │ │ ├── code-settings-repositories.png │ │ ├── contract-inspector-detailed-report.png │ │ ├── dependency-checker-detailed-report.png │ │ ├── deploy-metadata-1.0.png │ │ ├── feedback-button.png │ │ ├── feedback-form.png │ │ ├── guide-configure-private-network.png │ │ ├── guide-edit-private-network.png │ │ ├── guide-factory-action-run-history.png │ │ ├── guide-factory-api.png │ │ ├── guide-factory-create-action.png │ │ ├── guide-factory-create-clone.png │ │ ├── guide-factory-monitor-alerts.png │ │ ├── guide-factory-monitor-clones.png │ │ ├── guide-factory-monitor-events.png │ │ ├── guide-factory-monitor-general-information.png │ │ ├── guide-factory-secrets.png │ │ ├── guide-fireblock-paste-api-key.png │ │ ├── guide-fireblocks-add-user.png │ │ ├── guide-fireblocks-api-key.png │ │ ├── guide-fireblocks-approval-process-automatic.png │ │ ├── guide-fireblocks-approval-process-manual.png │ │ ├── guide-fireblocks-asset-wallet-address.png │ │ ├── guide-fireblocks-csr-modal.png │ │ ├── guide-fireblocks-edit-api-key.png │ │ ├── guide-fireblocks-integration-tab.png │ │ ├── guide-fireblocks-vault-id.png │ │ ├── guide-forta-diagram.png │ │ ├── guide-fund-private-network-relayer.png │ │ ├── guide-meta-tx-copy-webhook.png │ │ ├── guide-profile-disable-system-notifications.png │ │ ├── guide-subgraph-private-network.png │ │ ├── guide-tenderly-private-network.png │ │ ├── guide-timelock-proposer.png │ │ ├── guide-timelock-role-receiver.png │ │ ├── guide-timelock-role-remover.png │ │ ├── guide-timelock-role-revoked.png │ │ ├── guide-timelock-roles-add-contract.png │ │ ├── guide-timelock-roles-general-information.png │ │ ├── guide-timelock-roles-grant.png │ │ ├── guide-timelock-roles-granted.png │ │ ├── guide-timelock-roles-schedule.png │ │ ├── guide-timelock-roles.png │ │ ├── guide-usage-notifications-all.png │ │ ├── guide-usage-notifications-create.png │ │ ├── guide-usage-notifications-edit-menu.png │ │ ├── guide-usage-notifications-system-unmetered.png │ │ ├── guide-usage-notifications-system.png │ │ ├── logs-detailed.png │ │ ├── logs-migration-1.0.png │ │ ├── logs-migration-2.0.png │ │ ├── logs.png │ │ ├── manage-address-book.png │ │ ├── manage-advanced-export-serverless.png │ │ ├── manage-api-key-v2.png │ │ ├── manage-api-key.png │ │ ├── manage-approvals.png │ │ ├── manage-forked-networks-create.png │ │ ├── manage-forked-networks-selection.png │ │ ├── manage-new-api-key-v2.png │ │ ├── manage-new-api-key.png │ │ ├── manage-notify-channels.png │ │ ├── manage-notify-datadog.png │ │ ├── manage-notify-discord.png │ │ ├── manage-notify-telegram.png │ │ ├── manage-notify-webhook.png │ │ ├── manage-private-networks-create.png │ │ ├── manage-private-networks-selection.png │ │ ├── manage-relayer-api-key.png │ │ ├── manage-relayer-policies.png │ │ ├── manage-relayers-create-api-key.png │ │ ├── manage-relayers-detail.png │ │ ├── manage-relayers.png │ │ ├── manage-role-create.png │ │ ├── manage-secrets.png │ │ ├── manage-team-invite.png │ │ ├── monitor-alert-v2.png │ │ ├── monitor-alert.png │ │ ├── monitor-migration-2.0.png │ │ ├── monitor-settings.png │ │ ├── monitor-templates.png │ │ ├── monitor.webm │ │ ├── monitors-sentinels-faq.png │ │ ├── notification-channel-setup-1.0.png │ │ ├── notification-channel-setup-2.0.png │ │ ├── proposal-migration-1.0.png │ │ ├── proposal-migration-2.0.png │ │ ├── proposal.webm │ │ ├── relayer-mempool-visibility-check.png │ │ ├── relayer-withdraw-screen.png │ │ ├── relayer-withdraw.png │ │ ├── relayers-faq.png │ │ ├── relayers-migration-1.0.png │ │ ├── relayers-migration-2.0.png │ │ ├── relayers.webm │ │ ├── remix-plugin-api-key.png │ │ ├── remix-plugin-approval-process.png │ │ ├── remix-plugin-deploy-completed.png │ │ ├── remix-plugin-deploy-deterministic.png │ │ ├── remix-plugin-deploy.png │ │ ├── remix-plugin-install.png │ │ ├── remix-plugin-network.png │ │ ├── remix-plugin-setup.png │ │ ├── safe-migration-1.0.png │ │ ├── secrets-migration-1.0.png │ │ ├── secrets-migration-2.0.png │ │ ├── sentinel-migration-1.0.png │ │ ├── switch-back-faq.png │ │ ├── tenant-migration-1.0.png │ │ ├── tenant-migration-2.0.png │ │ ├── timelock-migration-1.0.png │ │ ├── transaction-proposals-faq.png │ │ ├── tutorial-access-control-add.gif │ │ ├── tutorial-access-control-copy-address.png │ │ ├── tutorial-access-control-factory.png │ │ ├── tutorial-access-control-page.gif │ │ ├── tutorial-access-control-submit-proposal.gif │ │ ├── tutorial-access-control-submit-tx.gif │ │ ├── tutorial-access-control-tx-general.png │ │ ├── tutorial-actions-action.png │ │ ├── tutorial-actions-alert.png │ │ ├── tutorial-deploy-block-explorer.png │ │ ├── tutorial-deploy-contract.png │ │ ├── tutorial-deploy-copy-relayer.png │ │ ├── tutorial-deploy-directory.png │ │ ├── tutorial-deploy-end-wizard.png │ │ ├── tutorial-deploy-environments.png │ │ ├── tutorial-deploy-executed-upgrade.png │ │ ├── tutorial-deploy-networks.png │ │ ├── tutorial-deploy-relayer-wizard.png │ │ ├── tutorial-deploy-safe.png │ │ ├── tutorial-deploy-step1-wizard.png │ │ ├── tutorial-deploy-step2-wizard.png │ │ ├── tutorial-deploy-step3-wizard.png │ │ ├── tutorial-deploy-step4-wizard.png │ │ ├── tutorial-deploy-upgrade-wizard.png │ │ ├── tutorial-forked-network-phalcon-create.png │ │ ├── tutorial-forked-networks-create.png │ │ ├── tutorial-forked-networks-deploy-intro.png │ │ ├── tutorial-forked-networks-deploy-wizard-step1.png │ │ ├── tutorial-forked-networks-deploy-wizard-step2.png │ │ ├── tutorial-forked-networks-deploy-wizard-step3.png │ │ ├── tutorial-forked-networks-intro.png │ │ ├── tutorial-forked-networks-phalcon-dashboard.png │ │ ├── tutorial-ir-etherscan.png │ │ ├── tutorial-ir-first-monitor.png │ │ ├── tutorial-ir-monitor.png │ │ ├── tutorial-ir-proposal-action.png │ │ ├── tutorial-monitor-alerts.png │ │ ├── tutorial-monitor-card.png │ │ ├── tutorial-monitor-event-filter.png │ │ ├── tutorial-monitor-first.png │ │ ├── tutorial-monitor-landing.png │ │ ├── tutorial-monitor-receive.png │ │ ├── tutorial-monitor-save-template.png │ │ ├── tutorial-monitor-transaction-filters.png │ │ ├── tutorial-relayer-step1.png │ │ ├── tutorial-relayer-step2.png │ │ ├── tutorial-relayer-step3-1.png │ │ ├── tutorial-relayer-step3.png │ │ ├── tutorial-relayer-step4.png │ │ ├── tutorial-workflow-active-scenario.png │ │ ├── tutorial-workflow-first-action.png │ │ ├── tutorial-workflow-scenario.png │ │ ├── wizard-deploy-further-steps.png │ │ ├── wizard-plugin-approval-process.png │ │ ├── wizard-plugin-configure-2.png │ │ ├── wizard-plugin-configure.png │ │ ├── wizard-plugin-deploy.png │ │ ├── wizard-plugin-deterministic.png │ │ ├── wizard-plugin-network-2.png │ │ └── wizard-plugin-start.png │ ├── attachments │ ├── oz-mainnet-graphql-config-example.zip │ └── yarn.lock │ ├── nav.adoc │ ├── pages │ ├── changelog.adoc │ ├── dac.adoc │ ├── faq.adoc │ ├── guide │ │ ├── factory-monitor.adoc │ │ ├── fireblock-defender-integration.adoc │ │ ├── forked-network.adoc │ │ ├── meta-tx.adoc │ │ ├── private-network.adoc │ │ ├── timelock-roles.adoc │ │ ├── upgrade-actions-dependencies.adoc │ │ └── usage-notification.adoc │ ├── index.adoc │ ├── integrations.adoc │ ├── logs.adoc │ ├── module │ │ ├── access-control.adoc │ │ ├── actions.adoc │ │ ├── address-book.adoc │ │ ├── audit.adoc │ │ ├── code.adoc │ │ ├── deploy.adoc │ │ ├── monitor.adoc │ │ ├── relayers.adoc │ │ └── transaction-proposals.adoc │ ├── remix-plugin.adoc │ ├── sdk.adoc │ ├── settings.adoc │ ├── settings │ │ └── notifications.adoc │ ├── tutorial │ │ ├── access-control.adoc │ │ ├── actions.adoc │ │ ├── deploy.adoc │ │ ├── monitor.adoc │ │ ├── relayer.adoc │ │ └── workflows.adoc │ └── wizard-plugin.adoc │ └── partials │ └── network.adoc ├── netlify.toml ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | .DS_Store 4 | *.lock 5 | .vscode 6 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to the Defender Docs 2 | Thank you for your interest in contributing to the Defender Docs! 3 | 4 | Please take a moment to review this document in order to make the contribution process easy and effective for everyone involved. 5 | 6 | ## Using the issue tracker 7 | 8 | The [issue tracker](https://github.com/Openzeppelin/defender-docs/issues) is 9 | the preferred channel for [submitting pull requests](#pull-requests), but please respect the following 10 | restrictions: 11 | 12 | - Please **do not** use the issue tracker for personal support requests (reach out to [defender-support@openzeppelin.com](mailto:defender-support@openzeppelin.com) or submit a post to the [Defender Forum](https://forum.openzeppelin.com/)). 13 | 14 | - Please **do not** derail or troll issues. Keep the discussion on topic and 15 | respect the opinions of others. 16 | 17 | ## Pull requests 18 | 19 | Good pull requests are a fantastic help. They should remain focused in scope and avoid containing unrelated commits. 20 | 21 | **Please ask first** before embarking on any significant pull request (e.g. 22 | implementing features, refactoring code, porting to a different language), 23 | otherwise you risk spending a lot of time working on something that the 24 | project's developers might not want to merge into the project. 25 | 26 | Please adhere to the coding conventions used throughout a project (indentation, 27 | accurate comments, etc.) and any other requirements (such as test coverage). 28 | 29 | Adhering to the following process is the best way to get your work 30 | included in the project: 31 | 32 | 1. [Fork](https://help.github.com/articles/fork-a-repo/) the project, clone your 33 | fork, and configure the remotes: 34 | 35 | ```bash 36 | # Clone your fork of the repo into the current directory 37 | git clone https://github.com//defender-docs.git 38 | # Navigate to the newly cloned directory 39 | cd defender-docs 40 | # Assign the original repo to a remote called "upstream" 41 | git remote add upstream https://github.com/OpenZeppelin/defender-docs.git 42 | ``` 43 | 44 | 2. If you cloned a while ago, get the latest changes from upstream: 45 | 46 | ```bash 47 | git checkout main 48 | git pull upstream main 49 | ``` 50 | 51 | 3. Create a new topic branch (off the main project development branch) to 52 | contain your feature, change, or fix: 53 | 54 | ```bash 55 | git checkout -b 56 | ``` 57 | 58 | 4. Install locked dependencies: 59 | 60 | ```bash 61 | npm install 62 | ``` 63 | 64 | Ensure that your `node` and `npm` versions are compatible with the `engines` 65 | specification in `package.json`. 66 | 67 | 5. Commit your changes in logical chunks. Please adhere to these [git commit 68 | message guidelines](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) 69 | or your code is unlikely be merged into the main project. Use Git's 70 | [interactive rebase](https://help.github.com/articles/about-git-rebase/) 71 | feature to tidy up your commits before making them public. 72 | 73 | 6. Locally merge (or rebase) the upstream development branch into your topic branch: 74 | 75 | ```bash 76 | git pull [--rebase] upstream main 77 | ``` 78 | 79 | 7. Preview changes: 80 | 81 | ```bash 82 | npm run docs:watch 83 | ``` 84 | 85 | 8. Push your topic branch up to your fork: 86 | 87 | ```bash 88 | git push origin 89 | ``` 90 | 91 | 9. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) 92 | with a clear title and description. 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenZeppelin Defender Documentation 2 | 3 | Sources for OpenZeppelin Defender documentation. Hosted at [docs.openzeppelin.com/defender/](https://docs.openzeppelin.com/defender/). 4 | 5 | ## About Defender 6 | 7 | OpenZeppelin Defender is a mission-critical developer security platform to code, audit, deploy, monitor, and operate blockchain applications with confidence. 8 | 9 | - [Learn more](https://openzeppelin.com/defender) 10 | - [Read the docs](https://docs.openzeppelin.com/defender/) 11 | 12 | ## Authoring content 13 | 14 | To preview locally run `npm run docs:watch`. 15 | 16 | Documents are written in AsciiDoc. Consult the [Syntax Quick Reference](https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/) if needed. 17 | -------------------------------------------------------------------------------- /docs/antora.yml: -------------------------------------------------------------------------------- 1 | name: defender 2 | title: Defender 3 | version: ~ 4 | nav: 5 | - modules/ROOT/nav.adoc 6 | asciidoc: 7 | attributes: 8 | page-sidebar-collapse-default: 'Guides' -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/access-control-contract.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/access-control-contract.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/access-control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/access-control.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/action-migration-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/action-migration-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/actions-autotask-faq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/actions-autotask-faq.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/actions-parallel-workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/actions-parallel-workflow.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/actions-start-workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/actions-start-workflow.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/actions-workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/actions-workflow.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/actions.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/actions.webm -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/address-book-faq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/address-book-faq.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/address-book-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/address-book-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/address-book-migration-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/address-book-migration-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/address-book.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/address-book.webm -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/api-key-expiration-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/api-key-expiration-config.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/audit-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/audit-filter.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/audit-new-issue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/audit-new-issue.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/audit-reply-issue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/audit-reply-issue.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/audit-side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/audit-side.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/audit-status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/audit-status.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/audit-trail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/audit-trail.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/auto-action-general-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/auto-action-general-info.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/autotasks-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/autotasks-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/code-assets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/code-assets.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/code-report-summary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/code-report-summary.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/code-settings-advanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/code-settings-advanced.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/code-settings-repositories.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/code-settings-repositories.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/contract-inspector-detailed-report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/contract-inspector-detailed-report.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/dependency-checker-detailed-report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/dependency-checker-detailed-report.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/deploy-metadata-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/deploy-metadata-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/feedback-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/feedback-button.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/feedback-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/feedback-form.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-configure-private-network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-configure-private-network.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-edit-private-network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-edit-private-network.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-action-run-history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-action-run-history.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-api.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-create-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-create-action.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-create-clone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-create-clone.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-monitor-alerts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-monitor-alerts.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-monitor-clones.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-monitor-clones.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-monitor-events.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-monitor-events.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-monitor-general-information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-monitor-general-information.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-factory-secrets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-factory-secrets.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblock-paste-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblock-paste-api-key.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-add-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-add-user.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-api-key.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-approval-process-automatic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-approval-process-automatic.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-approval-process-manual.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-approval-process-manual.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-asset-wallet-address.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-asset-wallet-address.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-csr-modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-csr-modal.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-edit-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-edit-api-key.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-integration-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-integration-tab.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fireblocks-vault-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fireblocks-vault-id.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-forta-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-forta-diagram.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-fund-private-network-relayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-fund-private-network-relayer.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-meta-tx-copy-webhook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-meta-tx-copy-webhook.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-profile-disable-system-notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-profile-disable-system-notifications.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-subgraph-private-network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-subgraph-private-network.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-tenderly-private-network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-tenderly-private-network.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-proposer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-proposer.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-role-receiver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-role-receiver.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-role-remover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-role-remover.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-role-revoked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-role-revoked.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-roles-add-contract.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-roles-add-contract.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-roles-general-information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-roles-general-information.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-roles-grant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-roles-grant.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-roles-granted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-roles-granted.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-roles-schedule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-roles-schedule.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-timelock-roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-timelock-roles.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-usage-notifications-all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-usage-notifications-all.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-usage-notifications-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-usage-notifications-create.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-usage-notifications-edit-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-usage-notifications-edit-menu.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-usage-notifications-system-unmetered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-usage-notifications-system-unmetered.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guide-usage-notifications-system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/guide-usage-notifications-system.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/logs-detailed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/logs-detailed.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/logs-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/logs-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/logs-migration-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/logs-migration-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/logs.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-address-book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-address-book.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-advanced-export-serverless.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-advanced-export-serverless.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-api-key-v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-api-key-v2.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-api-key.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-approvals.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-approvals.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-forked-networks-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-forked-networks-create.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-forked-networks-selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-forked-networks-selection.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-new-api-key-v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-new-api-key-v2.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-new-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-new-api-key.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-notify-channels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-notify-channels.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-notify-datadog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-notify-datadog.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-notify-discord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-notify-discord.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-notify-telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-notify-telegram.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-notify-webhook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-notify-webhook.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-private-networks-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-private-networks-create.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-private-networks-selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-private-networks-selection.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-relayer-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-relayer-api-key.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-relayer-policies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-relayer-policies.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-relayers-create-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-relayers-create-api-key.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-relayers-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-relayers-detail.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-relayers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-relayers.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-role-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-role-create.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-secrets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-secrets.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/manage-team-invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/manage-team-invite.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/monitor-alert-v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/monitor-alert-v2.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/monitor-alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/monitor-alert.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/monitor-migration-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/monitor-migration-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/monitor-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/monitor-settings.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/monitor-templates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/monitor-templates.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/monitor.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/monitor.webm -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/monitors-sentinels-faq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/monitors-sentinels-faq.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/notification-channel-setup-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/notification-channel-setup-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/notification-channel-setup-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/notification-channel-setup-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/proposal-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/proposal-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/proposal-migration-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/proposal-migration-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/proposal.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/proposal.webm -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/relayer-mempool-visibility-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/relayer-mempool-visibility-check.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/relayer-withdraw-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/relayer-withdraw-screen.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/relayer-withdraw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/relayer-withdraw.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/relayers-faq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/relayers-faq.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/relayers-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/relayers-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/relayers-migration-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/relayers-migration-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/relayers.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/relayers.webm -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/remix-plugin-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/remix-plugin-api-key.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/remix-plugin-approval-process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/remix-plugin-approval-process.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/remix-plugin-deploy-completed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/remix-plugin-deploy-completed.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/remix-plugin-deploy-deterministic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/remix-plugin-deploy-deterministic.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/remix-plugin-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/remix-plugin-deploy.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/remix-plugin-install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/remix-plugin-install.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/remix-plugin-network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/remix-plugin-network.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/remix-plugin-setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/remix-plugin-setup.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/safe-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/safe-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/secrets-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/secrets-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/secrets-migration-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/secrets-migration-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/sentinel-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/sentinel-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/switch-back-faq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/switch-back-faq.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tenant-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tenant-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tenant-migration-2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tenant-migration-2.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/timelock-migration-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/timelock-migration-1.0.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/transaction-proposals-faq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/transaction-proposals-faq.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-access-control-add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-access-control-add.gif -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-access-control-copy-address.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-access-control-copy-address.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-access-control-factory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-access-control-factory.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-access-control-page.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-access-control-page.gif -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-access-control-submit-proposal.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-access-control-submit-proposal.gif -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-access-control-submit-tx.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-access-control-submit-tx.gif -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-access-control-tx-general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-access-control-tx-general.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-actions-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-actions-action.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-actions-alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-actions-alert.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-block-explorer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-block-explorer.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-contract.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-contract.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-copy-relayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-copy-relayer.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-directory.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-end-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-end-wizard.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-environments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-environments.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-executed-upgrade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-executed-upgrade.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-networks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-networks.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-relayer-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-relayer-wizard.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-safe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-safe.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-step1-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-step1-wizard.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-step2-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-step2-wizard.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-step3-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-step3-wizard.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-step4-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-step4-wizard.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-deploy-upgrade-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-deploy-upgrade-wizard.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-forked-network-phalcon-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-forked-network-phalcon-create.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-forked-networks-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-forked-networks-create.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-forked-networks-deploy-intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-forked-networks-deploy-intro.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-forked-networks-deploy-wizard-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-forked-networks-deploy-wizard-step1.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-forked-networks-deploy-wizard-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-forked-networks-deploy-wizard-step2.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-forked-networks-deploy-wizard-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-forked-networks-deploy-wizard-step3.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-forked-networks-intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-forked-networks-intro.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-forked-networks-phalcon-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-forked-networks-phalcon-dashboard.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-ir-etherscan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-ir-etherscan.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-ir-first-monitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-ir-first-monitor.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-ir-monitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-ir-monitor.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-ir-proposal-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-ir-proposal-action.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-monitor-alerts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-monitor-alerts.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-monitor-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-monitor-card.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-monitor-event-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-monitor-event-filter.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-monitor-first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-monitor-first.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-monitor-landing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-monitor-landing.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-monitor-receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-monitor-receive.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-monitor-save-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-monitor-save-template.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-monitor-transaction-filters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-monitor-transaction-filters.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-relayer-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-relayer-step1.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-relayer-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-relayer-step2.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-relayer-step3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-relayer-step3-1.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-relayer-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-relayer-step3.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-relayer-step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-relayer-step4.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-workflow-active-scenario.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-workflow-active-scenario.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-workflow-first-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-workflow-first-action.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/tutorial-workflow-scenario.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/tutorial-workflow-scenario.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/wizard-deploy-further-steps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/wizard-deploy-further-steps.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/wizard-plugin-approval-process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/wizard-plugin-approval-process.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/wizard-plugin-configure-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/wizard-plugin-configure-2.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/wizard-plugin-configure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/wizard-plugin-configure.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/wizard-plugin-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/wizard-plugin-deploy.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/wizard-plugin-deterministic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/wizard-plugin-deterministic.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/wizard-plugin-network-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/wizard-plugin-network-2.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/wizard-plugin-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/assets/images/wizard-plugin-start.png -------------------------------------------------------------------------------- /docs/modules/ROOT/attachments/oz-mainnet-graphql-config-example.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenZeppelin/defender-docs/8e0af4f2b61218caa6445ec70a1776c4bcbe3a96/docs/modules/ROOT/attachments/oz-mainnet-graphql-config-example.zip -------------------------------------------------------------------------------- /docs/modules/ROOT/nav.adoc: -------------------------------------------------------------------------------- 1 | * xref:index.adoc[Overview] 2 | 3 | * Modules 4 | ** xref:module/code.adoc[Code Inspector] 5 | ** xref:module/audit.adoc[Audit] 6 | ** xref:module/deploy.adoc[Deploy] 7 | ** xref:module/relayers.adoc[Relayers] 8 | ** xref:module/monitor.adoc[Monitor] 9 | ** xref:module/actions.adoc[Actions] 10 | ** xref:module/transaction-proposals.adoc[Transaction Proposals] 11 | ** xref:module/address-book.adoc[Address Book] 12 | ** xref:module/access-control.adoc[Access Control] 13 | 14 | * xref:settings.adoc[Settings] 15 | ** xref:logs.adoc[Logs] 16 | ** xref:settings/notifications.adoc[Notifications] 17 | 18 | * Tutorials 19 | ** xref:tutorial/deploy.adoc[Deploy] 20 | ** xref:tutorial/relayer.adoc[Relayer] 21 | ** xref:tutorial/monitor.adoc[Monitor] 22 | ** xref:tutorial/actions.adoc[Actions] 23 | ** xref:tutorial/access-control.adoc[Access Control] 24 | ** xref:tutorial/workflows.adoc[Workflows] 25 | 26 | * Guides 27 | ** xref:guide/forked-network.adoc[Deploy a smart contract on a forked network] 28 | ** xref:guide/private-network.adoc[Adding a complete private network] 29 | ** xref:guide/meta-tx.adoc[Relaying gasless meta-transactions] 30 | ** xref:guide/factory-monitor.adoc[Automatic monitoring for factory clones] 31 | ** xref:guide/timelock-roles.adoc[Managing roles of a TimelockController] 32 | ** xref:guide/usage-notification.adoc[Managing usage notifications] 33 | ** xref:guide/fireblock-defender-integration.adoc[Setup Fireblocks integrations within Defender] 34 | ** xref:guide/upgrade-actions-dependencies.adoc[Upgrading actions dependencies] 35 | 36 | 37 | * xref:dac.adoc[Defender as Code] 38 | * xref:remix-plugin.adoc[Remix Plugin] 39 | * xref:wizard-plugin.adoc[Contracts Wizard Plugin] 40 | * xref:sdk.adoc[SDK and API] 41 | * xref:integrations.adoc[Integrations] 42 | * xref:faq.adoc[FAQ] 43 | * xref:changelog.adoc[Changelog] -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/dac.adoc: -------------------------------------------------------------------------------- 1 | = Defender as Code Plugin 2 | 3 | Defender as Code (DaC) is a Serverless Framework plugin for automated resource management and configuration as code. 4 | 5 | WARNING: This plugin is under development and behavior might change. Handle with care. 6 | 7 | == Prerequisites 8 | 9 | Serverless Framework: https://www.serverless.com/framework/docs/getting-started/ 10 | 11 | == Installation 12 | 13 | You can initialise your Serverless project directly using our pre-configured template: 14 | 15 | ``` 16 | sls install --url https://github.com/OpenZeppelin/defender-as-code/tree/main/template -n my-service 17 | ``` 18 | 19 | NOTE: For the command above to work correctly you need access to this repo. 20 | 21 | Alternatively, you can install it directly into an existing project with: 22 | 23 | `yarn add @openzeppelin/defender-as-code` 24 | 25 | ## Setup 26 | 27 | There are a few ways you can set up the `serverless.yml` configuration: 28 | 29 | - Create it from scratch; 30 | - Use Defender's 2.0 Serverless export capability; 31 | - Leverage the example https://github.com/OpenZeppelin/defender-as-code/blob/main/template/serverless.yml[template, window=_blank] provided in the `defender-as-code` repository. 32 | 33 | If you already have resources such as contracts, notifications, relayers, actions, etc. in Defender, you can export a `serverless.yml` configuration file containing these resources from the manage → advanced page. 34 | 35 | image::manage-advanced-export-serverless.png[Defender Export Serverless] 36 | 37 | NOTE: If you have previously deployed with `defender-as-code` to the same account and subsequently created new resources through the Defender user interface, the export function will automatically assign a `stackResourceId` to the new resources based on the name of your latest deployment stack. If you have not deployed using `defender-as-code` before, a default stack name of `mystack` will be used. 38 | 39 | This plugin allows you to define Actions, Monitors, Notifications, Block Explorer API Keys, Relayers, Contracts, Policies, and Secrets declaratively from a `serverless.yml` and provision them via the CLI using `serverless deploy`. An example template below with an action, a relayer, a policy and a single relayer API key defined: 40 | 41 | ```yaml 42 | service: defender-as-code-template 43 | configValidationMode: error 44 | frameworkVersion: '3' 45 | 46 | provider: 47 | name: defender 48 | stage: ${opt:stage, 'dev'} 49 | stackName: 'mystack' 50 | ssot: false 51 | 52 | defender: 53 | key: '${env:TEAM_API_KEY}' 54 | secret: '${env:TEAM_API_SECRET}' 55 | 56 | resources: 57 | actions: 58 | action-example-1: 59 | name: 'Hello world from serverless' 60 | path: './actions/hello-world' 61 | relayer: ${self:resources.relayers.relayer-1} 62 | trigger: 63 | type: 'schedule' 64 | frequency: 1500 65 | paused: false 66 | # optional - unencrypted and scoped to the individual action 67 | environment-variables: 68 | hello: 'world!' 69 | action-example-2: 2cbc3f58-d962-4be8-a158-1035be4b661c 70 | 71 | policies: 72 | policy-1: 73 | gas-price-cap: 1000 74 | whitelist-receivers: 75 | - '0x0f06aB75c7DD497981b75CD82F6566e3a5CAd8f2' 76 | eip1559-pricing: true 77 | 78 | relayers: 79 | relayer-1: 80 | name: 'Test Relayer 1' 81 | network: 'sepolia' 82 | min-balance: 1000 83 | policy: ${self:resources.policies.policy-1} 84 | api-keys: 85 | - key1 86 | 87 | plugins: 88 | - '@openzeppelin/defender-as-code' 89 | ``` 90 | 91 | This requires setting the `key` and `secret` under the `defender` property of the YAML file. We recommend using environment variables or a secure (gitignored) configuration file to retrieve these values. Modify the `serverless.yml` accordingly. 92 | 93 | Ensure the Defender Team API Keys are setup with all appropriate API capabilities. 94 | 95 | The `stackName` (e.g. mystack) is combined with the resource key (e.g. relayer-1) to uniquely identify each resource. This identifier is called the `stackResourceId` (e.g. mystack.relayer-1) and allows you to manage multiple deployments within the same tenant. 96 | 97 | You may also reference existing Defender resources directly by their unique ID (e.g. `2cbc3f58-d962-4be8-a158-1035be4b661c`). These resources will not be managed by the plugin and will be ignored during the deploy process. However, you may reference them in other resources to update their configuration accordingly. 98 | A list of properties that support direct referencing: 99 | 100 | - `relayer` may reference a `relayerId` in Actions 101 | - `action-trigger` may reference an `actionid` in Monitor 102 | - `action-condition` may reference an `actionId` in Monitor 103 | - `address-from-relayer` may reference a `relayerId` in Relayer 104 | - `notify-config.channels` may reference multiple `notificationId` in Monitor 105 | - `contracts` may be used over `addresses` and reference multiple `contractId` in Monitor 106 | The following is an example of how a direct reference to a Defender contract and relayer can be used in monitor and action respectively: 107 | 108 | ```yaml 109 | ... 110 | contracts: 111 | contract-1: 'sepolia-0xd70d6A0480420b4C788AF91d0E1b0ca6141A9De8' # contractId of an existing resource in Defender 112 | relayers: 113 | relayer-2: 'bcb659c6-7e11-4d37-a15b-0fa9f3d3442c' # relayerId of an existing relayer in Defender 114 | actions: 115 | action-example-1: 116 | name: 'Hello world from serverless' 117 | path: './actions/hello-world' 118 | relayer: ${self:resources.relayers.relayer-2} 119 | trigger: 120 | type: 'schedule' 121 | frequency: 1500 122 | paused: false 123 | monitors: 124 | block-example: 125 | name: 'Block Example' 126 | type: 'BLOCK' 127 | network: 'sepolia' 128 | risk-category: 'TECHNICAL' 129 | # optional - either contracts OR addresses should be defined 130 | contracts: 131 | - ${self:resources.contracts.contract-1} 132 | ... 133 | ... 134 | ``` 135 | 136 | [[ssot-mode]] 137 | === SSOT mode 138 | 139 | Under the `provider` property in the `serverless.yml` file, you can optionally add a `ssot` boolean. SSOT or Single Source of Truth, ensures that the state of your stack in Defender is perfectly in sync with the `serverless.yml` template. 140 | This means that all resources, that are not defined in your current template file, are removed from Defender, with the exception of Relayers, upon deployment. If SSOT is not defined in the template, it will default to `false`. 141 | 142 | Any resource removed from the `serverless.yml` file does _not_ get automatically deleted in order to prevent inadvertent resource deletion. For this behaviour to be anticipated, SSOT mode must be enabled. 143 | 144 | === Secrets (Actions) 145 | 146 | Action secrets can be defined both globally and per stack. Secrets defined under `global` are not affected by changes to the `stackName` and will retain when redeployed under a new stack. Secrets defined under `stack` will be removed (on the condition that <<#ssot-mode, SSOT mode>> is enabled) when the stack is redeployed under a new `stackName`. To reference secrets defined under `stack`, use the following format: `_`, for example `mystack_test`. 147 | 148 | ```yaml 149 | secrets: 150 | # optional - global secrets are not affected by stackName changes 151 | global: 152 | foo: ${self:custom.config.secrets.foo} 153 | hello: ${self:custom.config.secrets.hello} 154 | # optional - stack secrets (formatted as _) 155 | stack: 156 | test: ${self:custom.config.secrets.test} 157 | ``` 158 | 159 | [[types-and-schema-validation]] 160 | === Types and Schema validation 161 | 162 | We provide auto-generated documentation based on the JSON schemas: 163 | 164 | - https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/defender.md[Defender Property] 165 | - https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/provider.md[Provider Property] 166 | - https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/resources.md[Resources Property] 167 | 168 | More information on types can be found https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/index.ts[here]. Specifically, the types preceded with `Y` (e.g. YRelayer). For the schemas, you can check out the https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs-schemas[docs-schema] folder. 169 | 170 | Additionally, an https://github.com/OpenZeppelin/defender-as-code/blob/main/examples/defender-test-project/serverless.yml[example project] is available which provides majority of properties that can be defined in the `serverless.yml` file. 171 | 172 | == Commands 173 | 174 | === Deploy 175 | 176 | You can use `sls deploy` to deploy your current stack to Defender. 177 | 178 | The deploy takes in an optional `--stage` flag, which is defaulted to `dev` when installed from the template above. 179 | 180 | Moreover, the `serverless.yml` may contain an `ssot` property. More information can be found in the <<#ssot-mode, SSOT mode>> section. 181 | 182 | This command will append a log entry in the `.defender` folder of the current working directory. Additionally, if any new relayer keys are created, these will be stored as JSON objects in the `.defender/relayer-keys` folder. 183 | 184 | WARNING: When installed from the template, we ensure the `.defender` folder is ignored from any git commits. However, when installing directly, make sure to add this folder in your `.gitignore` file. 185 | 186 | === Info 187 | 188 | You can use `sls info` to retrieve information on every resource defined in the `serverless.yml` file, including unique identifiers, and properties unique to each component. 189 | 190 | === Remove 191 | 192 | You can use `sls remove` to remove all resources defined in the `serverless.yml` file from Defender. 193 | 194 | NOTE: To avoid potential loss of funds, Relayers can only be deleted from the Defender UI directly. 195 | 196 | === Logs 197 | 198 | You can use `sls logs --function ` to retrieve the latest action logs for a given action identifier (e.g. mystack.action-example-1). This command will run continiously and retrieve logs every 2 seconds. 199 | 200 | === Invoke 201 | 202 | You can use `sls invoke --function ` to manually run an action, given its identifier (e.g. mystack.action-example-1). 203 | 204 | NOTE: Each command has a standard output to a JSON object. 205 | 206 | == Caveats 207 | 208 | Errors thrown during the `deploy` process, will not revert any prior changes. Common errors are: 209 | 210 | - Not having set the API key and secret 211 | - Insufficient permissions for the API key 212 | - Validation error of the `serverless.yml` file (see <>) 213 | 214 | Usually, fixing the error and retrying the deploy should suffice as any existing resources will fall within the `update` clause of the deployment. However, if unsure, you can always call `sls remove` to remove the entire stack, and retry. 215 | 216 | Action secrets are encrypted key-value pairs and injected at runtime into the lambda environment. Secrets are scoped to all actions automatically. Alternatively, you may use environment-variables to define key-value pairs that are scoped to the individual action, and available at runtime through `process.env`. Note that these values are not encrypted. -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/faq.adoc: -------------------------------------------------------------------------------- 1 | [[faq]] 2 | = Frequently Asked Questions (FAQ) 3 | 4 | OpenZeppelin Defender is the evolution of Defender, with an improved user experience, a cleaner interface, and new features that offer a more cohesive experience across the DevSecOps lifecycle. 5 | 6 | == How can I sign up to Defender? 7 | 8 | You can sign up to Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 9 | 10 | == Once I migrate to Defender, can I continue using Defender legacy? 11 | 12 | No, once you migrate to Defender, you will no longer have access to Defender 1.0 UI and API. 13 | 14 | == Are there any breaking changes when migrating? 15 | 16 | Yes, there are multiple changes to the API endpoints that will require you to update your integrations. You can find the API docs https://www.api-docs.defender.openzeppelin.com/#defender-sdk[here, window=_blank]. 17 | 18 | == What are the pricing options for Defender? 19 | 20 | You can find the pricing for Defender https://www.openzeppelin.com/pricing[here, window=_blank]. 21 | 22 | == Does Defender offer support? 23 | 24 | We offer a Service Level and Support Agreement (SLA) for paid subscriptions. Learn more xref:index.adoc#sla[here]. 25 | 26 | == How can I get an upgrade my tenant account? 27 | 28 | You can use the billing page to upgrade your tenant account to a higher tier https://defender.openzeppelin.com/v2/#/billing/[here, window=_blank]. 29 | 30 | == Where can I see my tier quota usage? 31 | 32 | You can see your tier quota usage in the billing page https://defender.openzeppelin.com/v2/#/billing/usage[here, window=_blank]. -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/guide/factory-monitor.adoc: -------------------------------------------------------------------------------- 1 | # Automatic monitoring for factory clones 2 | 3 | The factory-clone pattern can be advantageous for minimizing gas costs. However, since each clone gets deployed to a new address, it may be a challenge to efficiently track and monitor each of these contracts. 4 | 5 | This guide shows how to use Defender to monitor a factory contract as well as the clone contracts created by it. Monitor automation is achieved through the following structure of Defender modules: 6 | 7 | * A Monitor watches for successful event emitted by the factory contract that creates a clone. If detected, it triggers an xref:module/actions.adoc[Action] and xref:module/actions.adoc#monitor_invocations[passes along information] about the transaction. 8 | * The Action makes use of the https://www.npmjs.com/package/@openzeppelin/defender-sdk[`defender-sdk`, window=_blank] to add the address of the newly created contract to the xref:module/address-book.adoc[address book] for easier monitoring. 9 | * Aditionally, the Action uses the https://www.npmjs.com/package/@openzeppelin/defender-sdk[`defender-sdk`, window=_blank] to add the clone address to the list of addresses watched by a Monitor. 10 | 11 | In this case, the contract ABI can be pre-supplied since clone contracts will have identical ABIs. Alternatively, you may be able to dynamically retrieve the ABI from a verified contract at a given address using https://docs.etherscan.io/api-endpoints/contracts[Etherscan's API, window=_blank]. 12 | 13 | [[generate-api-key]] 14 | == Generate API Key 15 | 16 | To programmatically add a contract to the address book, the https://www.npmjs.com/package/@openzeppelin/defender-sdk[`sdk`, window=_blank] requires credentials in the form of an API key and secret. Create and copy the credentials in the https://defender.openzeppelin.com/v2/#/settings/api-keys/new[API keys page, window=_blank]. 17 | 18 | image::guide-factory-api.png[Create API credentials] 19 | 20 | Now, navigate to the https://defender.openzeppelin.com/v2/#/settings/secrets[Secrets, window=_blank] page in Defender and create a new secret with the name `API_KEY` and paste in the API key. Create another secret with the name `API_SECRET` and paste in the API secret. These secrets will be used by the Action securely. 21 | 22 | image::guide-factory-secrets.png[Save API credentials] 23 | 24 | [[create-action]] 25 | == Create the Action 26 | 27 | Navigate to the https://defender.openzeppelin.com/v2/#/actions/automatic/new?[Action creation page, window=_blank], enter a name, and select `Webhook` as trigger. Then, paste the following Action code and save it: 28 | 29 | [source,jsx] 30 | ---- 31 | const { Defender } = require('@openzeppelin/defender-sdk'); 32 | 33 | exports.handler = async function (event) { 34 | const creds = { 35 | apiKey: event.secrets.API_KEY, 36 | apiSecret: event.secrets.API_SECRET, 37 | } 38 | const client = new Defender(creds); 39 | 40 | const payload = event.request.body 41 | const matchReasons = payload.matchReasons 42 | const newCloneAddress = matchReasons[0].params._clone 43 | const newCloneAbi = `[ 44 | { 45 | "anonymous": false, 46 | "inputs": [ 47 | { 48 | "indexed": false, 49 | "internalType": "uint256", 50 | "name": "value", 51 | "type": "uint256" 52 | } 53 | ], 54 | "name": "ValueChanged", 55 | "type": "event" 56 | }, 57 | { 58 | "inputs": [ 59 | { 60 | "internalType": "uint256", 61 | "name": "value", 62 | "type": "uint256" 63 | } 64 | ], 65 | "name": "initialize", 66 | "outputs": [], 67 | "stateMutability": "nonpayable", 68 | "type": "function" 69 | }, 70 | { 71 | "inputs": [], 72 | "name": "retrieve", 73 | "outputs": [ 74 | { 75 | "internalType": "uint256", 76 | "name": "", 77 | "type": "uint256" 78 | } 79 | ], 80 | "stateMutability": "view", 81 | "type": "function" 82 | }, 83 | { 84 | "inputs": [ 85 | { 86 | "internalType": "uint256", 87 | "name": "value", 88 | "type": "uint256" 89 | } 90 | ], 91 | "name": "store", 92 | "outputs": [], 93 | "stateMutability": "nonpayable", 94 | "type": "function" 95 | } 96 | ]` 97 | // Add new clone contract 98 | await client.proposal.addContract({ 99 | network: 'sepolia', 100 | address: newCloneAddress, 101 | name: `Clone ${newCloneAddress}`, 102 | abi: newCloneAbi, 103 | }) 104 | } 105 | ---- 106 | 107 | image::guide-factory-create-action.png[Create Action] 108 | 109 | The Action is now ready to be triggered by a Monitor. 110 | 111 | NOTE: Manually triggering this Action will be raise an error, since the Action relies on data supplied by a Monitor (such as the address of the newly deployed clone contract address). 112 | 113 | [[create-monitor]] 114 | == Create the Monitor 115 | 116 | This Monitor will watch for an event emitted by the factory contract signaling that a new clone has been created. Navigate to the https://defender.openzeppelin.com/v2/#/monitor/new/custom[Monitor creation page, window=_blank], choose a name, risk category, and select the Factory contract (add the factory if it's not already added). 117 | 118 | image::guide-factory-monitor-general-information.png[Monitor General Information] 119 | 120 | Leave `Transaction Filters` as it is, and continue to the `Events` tab. Here, select the event name for clone creation and leave the event parameters blank to catch all emitted events. 121 | 122 | image::guide-factory-monitor-events.png[Monitor Events] 123 | 124 | Lastly, open the `Alerts` section and select the Action created in the previous step within the `Execute an Action` dropdown. Feel free to add any other setting, like notifications, and save the Monitor. 125 | 126 | image::guide-factory-monitor-alerts.png[Monitor Alerts] 127 | 128 | As with any action, the triggering of this Monitor will be recorded in the xref:logs.adoc[Logs]. 129 | 130 | [[test-run]] 131 | == Test run 132 | 133 | To test the set up, navigate to https://defender.openzeppelin.com/v2/#/transaction-proposals/new?[Transaction Proposals, window=_blank] to manually create a clone through the factory. Select the factory contract, and call the function that creates a clone with any parameters needed. 134 | 135 | image::guide-factory-create-clone.png[Transaction Proposal to create clone] 136 | 137 | Then, execute this this transaction with your preferred approval process, like a Relayer or EOA wallet. Head over to run history of the Action to verify it was triggered by the Monitor, adding the clone contract address to Defender. 138 | 139 | image::guide-factory-action-run-history.png[Action Run History] 140 | 141 | [[create-clone-monitor]] 142 | == Create Monitor for clones 143 | 144 | Now that you have a clone contract to serve as a template for all future clone contracts, it's time to create a Monitor for them. Navigate to the https://defender.openzeppelin.com/v2/#/monitor/new/custom[Monitor creation page, window=_blank], choose a name, risk category, and select the clone contract. 145 | 146 | Aditionally, feel free to add any other filters for transactions, events, and functions, or notifications. Save the Monitor and observe the logs/notifications to verify that the Monitor is working as expected. 147 | 148 | image::guide-factory-monitor-clones.png[Monitor Clones] 149 | 150 | [[action-monitor-clone]] 151 | == Automatically add clones to Monitor 152 | 153 | With the last Monitor, you can update the Action to add any newly created contract to the list of addresses being monitored by the Monitor. Update the Action code with the following code, replacing `monitorId` with the ID of the Monitor created in the previous step: 154 | 155 | [source,jsx] 156 | ---- 157 | const { Defender } = require('@openzeppelin/defender-sdk'); 158 | 159 | exports.handler = async function (event) { 160 | const creds = { 161 | apiKey: event.secrets.API_KEY, 162 | apiSecret: event.secrets.API_SECRET, 163 | } 164 | const client = new Defender(creds); 165 | 166 | const payload = event.request.body 167 | const matchReasons = payload.matchReasons 168 | const newCloneAddress = matchReasons[0].params._clone 169 | const newCloneAbi = `[ 170 | { 171 | "anonymous": false, 172 | "inputs": [ 173 | { 174 | "indexed": false, 175 | "internalType": "uint256", 176 | "name": "value", 177 | "type": "uint256" 178 | } 179 | ], 180 | "name": "ValueChanged", 181 | "type": "event" 182 | }, 183 | { 184 | "inputs": [ 185 | { 186 | "internalType": "uint256", 187 | "name": "value", 188 | "type": "uint256" 189 | } 190 | ], 191 | "name": "initialize", 192 | "outputs": [], 193 | "stateMutability": "nonpayable", 194 | "type": "function" 195 | }, 196 | { 197 | "inputs": [], 198 | "name": "retrieve", 199 | "outputs": [ 200 | { 201 | "internalType": "uint256", 202 | "name": "", 203 | "type": "uint256" 204 | } 205 | ], 206 | "stateMutability": "view", 207 | "type": "function" 208 | }, 209 | { 210 | "inputs": [ 211 | { 212 | "internalType": "uint256", 213 | "name": "value", 214 | "type": "uint256" 215 | } 216 | ], 217 | "name": "store", 218 | "outputs": [], 219 | "stateMutability": "nonpayable", 220 | "type": "function" 221 | } 222 | ]` 223 | // Add new clone contract 224 | await client.proposal.addContract({ 225 | network: 'sepolia', 226 | address: newCloneAddress, 227 | name: `Clone ${newCloneAddress}`, 228 | abi: newCloneAbi, 229 | }) 230 | 231 | // Add clone contract to Monitor 232 | const monitorId = 'REPLACE' 233 | const monitor = await client.monitor.get(monitorId) 234 | const subscribedAddresses = monitor.addressRules[0].addresses 235 | subscribedAddresses.push(newCloneAddress) 236 | await client.action.update(monitorId, { addresses: subscribedAddresses }) 237 | } 238 | ---- 239 | 240 | Now when the Action runs, not only will it add the contract to Defender, it will also add it to the Monitor. 241 | 242 | To verify, execute another test run! 243 | 244 | [[references]] 245 | == References 246 | 247 | * xref::module/actions.adoc[Actions Documentation] 248 | * xref::module/monitor.adoc[Monitor Documentation] -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/guide/fireblock-defender-integration.adoc: -------------------------------------------------------------------------------- 1 | = Fireblocks integration within Defender 2 | 3 | You can directly submit transactions to Fireblocks from Defender. Fireblocks is a robust asset management solution that utilizes multi-party computation to secure all treasury operations, ensuring enhanced security and efficiency. 4 | 5 | 6 | [[pre-requisites]] 7 | == Pre-requisites 8 | 9 | * If you want leverage Fireblocks within Defender you can contact the OZ team to enable to Fireblocks integration for your account. 10 | 11 | [[generate-csr-file]] 12 | == 1. Generate CSR file 13 | . To use this feature, navigate to the *Settings* page and click on *Approval Process* in the sidebar. If the Fireblocks integration is enabled for your account, go to the *Integrations* tab, which is located next to the *All Approval Process* tab. 14 | + 15 | image::guide-fireblocks-integration-tab.png[Integration tab] 16 | + 17 | . Click on *Generate new API Key for Fireblocks*. Here, you will need to generate a Certificate Signing Request (CSR), which will be used within the Fireblocks platform to enable this feature and create API keys. 18 | + 19 | image::guide-fireblocks-csr-modal.png[CSR Generation Modal] 20 | This will trigger Defender to generate a public/private key-pair. The CSR is then generated and signed with the private key and securely stored to prevent leakage. 21 | 22 | [[create-fireblocks-api-user]] 23 | == 2. Create Fireblocks API user 24 | . First, you will need to import the CSR within the Fireblocks UI when creating a new API user. Note that the API user will require any role that can _at least_ initiate transactions, e.g. Signer. 25 | + 26 | image::guide-fireblocks-add-user.png[Create API user, width=400] 27 | + 28 | . Once the API user has been created and approved by the Fireblocks workspace owner, copy the Fireblocks API key and navigate to the Fireblocks API Keys page. You should see an incomplete API key setup, which you can then edit and complete with the Fireblocks API key. Note that you will not be able to generate a new CSR file unless you complete the setup or delete the previous incomplete one. 29 | + 30 | image::guide-fireblocks-api-key.png[API Key generated] 31 | + 32 | 33 | 34 | [[setup-defender-integration]] 35 | == 3. Connect Fireblocks with Defender 36 | . First, navigate to the *Settings* page subsequently click *Approval Process* in the sidebar, the navigate to the *Integrations* tab. Over here click on the *Paste API Key from Fireblocks*. 37 | + 38 | image::guide-fireblock-paste-api-key.png[Insert API Key Defender] 39 | + 40 | . Insert the Fireblocks API key. 41 | + 42 | image::guide-fireblocks-edit-api-key.png[Insert API key, width=600] 43 | + 44 | NOTE: To submit a transaction to Fireblocks via Defender, ensure the correct permissions are set in Fireblocks, such as the relevant whitelisted addresses and the Transaction Access Policy (TAP). For example, you might need to whitelist the contract address you wish to interact with, as well as ensure that the newly created API user is allowed to interact with the relevant account and vaults (defined in the TAP). 45 | 46 | [[create-approval-process]] 47 | == 4. Create Approval Process 48 | 49 | [[create-approval-process-automatic]] 50 | === Pick a Fireblocks Wallet from the List 51 | You can pick a Fireblocks wallet from the list of available wallets by just providing the Fireblocks API key. We will attempt to fetch the list of available vaults and wallets from Fireblocks. 52 | 53 | image::guide-fireblocks-approval-process-automatic.png[Create Defender Approval Process] 54 | 55 | [[create-approval-process-manual]] 56 | === Manually Add a Fireblocks Wallet 57 | In some rare cases you might not see your wallets in the list that is automatically fetched from Fireblocks. In that case you can select the `Manual` option and type in the required information manually. 58 | 59 | image::guide-fireblocks-approval-process-manual.png[Create Defender Approval Process] 60 | 61 | To get your **Vault ID**, head to Fireblocks console, click on the vault you are interested in and copy the ID (last number) from the URL. 62 | 63 | image::guide-fireblocks-vault-id.png[Vault ID] 64 | 65 | To get your **Asset Wallet Address**, head to Fireblocks console, click on the asset you are interested in and copy the address (starts with 0x). 66 | 67 | image::guide-fireblocks-asset-wallet-address.png[Asset Wallet Address] 68 | 69 | 70 | [[approve-reject-transaction]] 71 | == 5. Approve or Reject a Transaction 72 | Note, Defender will not allow you to approve or reject a transaction from the UI. This is only possible via the Fireblocks mobile app or console. 73 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/guide/forked-network.adoc: -------------------------------------------------------------------------------- 1 | # Deploy a smart contract on a forked network 2 | 3 | Defender empowers you to harness your customized network forks for deploying and testing smart contracts, along with associated configurations of, for example, actions, monitors, and workflows. This guide will lead you through the steps of deploying a smart contract on a forked network and interacting with it. 4 | 5 | [[pre-requisites]] 6 | == Pre-requisites 7 | 8 | * OpenZeppelin Defender account. You can sign up to Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 9 | 10 | [[configure-forked-network]] 11 | == 1. Configure your forked network 12 | 13 | You will setup a forked network on https://phalcon.xyz[Phalcon, window=_blank] and add this network to Defender. To configure a forked network, follow these steps: 14 | 15 | . Register an account on https://phalcon.xyz[Phalcon, window=_blank] and create a new fork using Ethereum mainnet as the source network. 16 | . Ensure anti-replay protection is activated to use a distinct chain ID for your fork, preventing conflicts with public chain IDs. 17 | + 18 | image::tutorial-forked-network-phalcon-create.png[Phalcon create a fork] 19 | 20 | . Copy the RPC URL and Explorer URL (this can be found under 'Scan') of your forked network. You will need it to add the network to Defender. 21 | + 22 | image::tutorial-forked-networks-phalcon-dashboard.png[Phalcon dashboard] 23 | 24 | . Open https://defender.openzeppelin.com/v2/#/settings/networks/forks[Defender Forked Networks, window=_blank] in a web browser. 25 | . Click on *Add Forked Network*. 26 | + 27 | image::tutorial-forked-networks-intro.png[Forked Networks landing page] 28 | 29 | . Enter the details of your forked network which can be found in your Phalcon dashboard. 30 | . Click on *Save*. 31 | + 32 | image::tutorial-forked-networks-create.png[Forked Networks added network] 33 | 34 | NOTE: You may use any provider to fork a network, such as https://conduit.xyz[Conduit, window=_blank]. However, we recommend using Phalcon as it is free and easy to use. 35 | 36 | [[configure-deploy-environment]] 37 | == 2. Configure the deploy environment 38 | 39 | You will setup a deploy environment for the forked network you just added to Defender. To configure a deploy environment, follow these steps: 40 | 41 | . Open https://defender.openzeppelin.com/v2/#/deploy[Defender Deploy, window=_blank] in a web browser. 42 | . Click on *Setup* for your production environment (or setup a test environment if your network is forked from a testnet). 43 | + 44 | image::tutorial-forked-networks-deploy-intro.png[Deploy landing page] 45 | 46 | . From the network dropdown, select the forked network you just added. 47 | + 48 | image::tutorial-forked-networks-deploy-wizard-step1.png[Delpoy wizard step 1] 49 | 50 | . Click on *Next* to continue. 51 | . When asked to provide a block explorer API key, click on *Skip this step* as it's *not possible to use block explorer API keys for forked networks*. 52 | + 53 | image::tutorial-forked-networks-deploy-wizard-step2.png[Delpoy wizard step 2] 54 | 55 | . On step 3 of the deploy wizard, create a new Relayer from which your deploy transaction will originate by clicking on *Create Relayer* from the dropdown menu. 56 | + 57 | image::tutorial-forked-networks-deploy-wizard-step3.png[Delpoy wizard step 3] 58 | 59 | . Lastly, click on *Skip this step* when asked to select an upgrade approval process. *Currently, upgrades are not supported for forked networks*. 60 | . Make sure to copy the generated team API keys and store them in a safe place. You will need them to interact with your deploy environment. 61 | 62 | Your deploy environment is now setup! 63 | 64 | NOTE: You should fund the relayer account with enough ETH to cover the gas costs of your deploy transaction. Most providers have a faucet that you can use to fund your relayer account. For Phalcon, you can find this on the dashboard. 65 | 66 | [[deploy-contract]] 67 | == 3. Deploy a smart contract on a forked network 68 | 69 | You will deploy a smart contract on the forked network you just added to Defender. To deploy a smart contract, follow these steps: 70 | 71 | . Setup a JavaScript project and install the https://www.npmjs.com/package/@openzeppelin/defender-sdk-deploy-client[defender-sdk-deploy-client, window=_blank] NPM package. Alternatively, you can use the https://github.com/OpenZeppelin/defender-sdk/blob/main/examples/deploy-contract/index.js[defender-sdk delpoy example script, window=_blank] provided in the OpenZeppelin Defender SDK repository. 72 | . The deployment code will look something like this: 73 | + 74 | ```js 75 | // Retrieve and confirm the approval process for deployment on your forked network 76 | const config = await client.deploy.getDeployApprovalProcess('mainnet-fork'); 77 | console.log(config); 78 | 79 | // Deploy a simple Box constract using the approval process retrieved above 80 | const deployment = await client.deploy.deployContract({ 81 | contractName: 'Box', 82 | contractPath: 'contracts/Box.sol', 83 | network: 'mainnet-fork', 84 | artifactPayload: JSON.stringify(artifactFile), 85 | licenseType: 'MIT', 86 | verifySourceCode: true, 87 | // Only provide the `salt` if you wish to use `CREATE2`. Otherwise, omit this field to use `CREATE`. 88 | salt: "a-unique-salt" 89 | }); 90 | 91 | // Retrieve the deployment status 92 | const deploymentStatus = await client.deploy.getDeployedContract(deployment.deploymentId); 93 | console.log(deploymentStatus); 94 | ``` 95 | . Run the script to deploy the contract. *Note* that providing a `salt` will deploy the contract using `CREATE2`. Otherwise, the contract will be deployed using the `CREATE` opcode. Visit the documentation for more information on the https://docs.openzeppelin.com/defender/tutorial/deploy#deploy-caveat[caveats of deployment]. 96 | . Once deployed, you can track the deployment status on the https://defender.openzeppelin.com/v2/#/deploy/environment/production[Defender Deploy dashboard, window=_blank]. 97 | 98 | 99 | [[next-steps]] 100 | == Next steps 101 | 102 | Congratulations! You have successfully deployed a smart contract on a forked network. If you have provided a `blockExplorerUrl`, you can verify the transaction on the block explorer of your forked network. 103 | 104 | NOTE: After deploying a contract, we recommend creating a Monitor and setting up Actions on Defender. Learn how to setup a Monitor xref::tutorial/monitor.adoc[here], and use Actions with its tutorial xref::tutorial/actions.adoc[here]. 105 | 106 | [[references]] 107 | == References 108 | 109 | * xref::module/deploy.adoc[Deploy Documentation] 110 | * xref::module/actions.adoc[Actions Documentation] 111 | * xref::module/monitor.adoc[Monitor Documentation] 112 | * https://phalcon.xyz[Phalcon, window=_blank] 113 | * https://conduit.xyz[Conduit, window=_blank] 114 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/guide/private-network.adoc: -------------------------------------------------------------------------------- 1 | # Adding a complete Private Network 2 | 3 | Private Networks allow you to customize your account by adding compatible mainnets and testnets. You can then use them as any other supported network to deploy, monitor, and manage smart contracts on those networks. This guide will lead you through the steps of adding a Private Network with a subgraph and Safe contracts. 4 | 5 | [[pre-requisites]] 6 | == Pre-requisites 7 | 8 | * OpenZeppelin Defender account. You can sign up to Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 9 | 10 | [[configure-forked-network]] 11 | == 1. Configure Private Network 12 | 13 | As an example, this guide uses https://tenderly.co/[Tenderly, window=_blank] to create a network to use. Follow these steps: 14 | 15 | . Regsiter an account on Tenderly and create a fork network from Ethereum mainnet. Toggle the custom chain ID and set it to a unique value to prevent conflicts with public chain IDs. 16 | + 17 | image::guide-tenderly-private-network.png[Tenderly create network] 18 | 19 | . Copy the network RPC and go to the https://defender.openzeppelin.com/v2/#/settings/networks/private/new[Private Network page on Defender, window=_blank]. Fill and submit the form with the network information, leaving the optional fields on blank (which will be configured in the next steps): 20 | + 21 | image::guide-configure-private-network.png[Configure network on Defender] 22 | 23 | [[deploy-safe-contracts]] 24 | == 2. Deploy Safe contracts 25 | 26 | With the Private Network created, you can now deploy the Safe contracts, which can be used for multisigs or CREATE2 deployments. Follow these steps: 27 | 28 | . Clone the `safe-smart-account` repository and install the dependencies: 29 | + 30 | ``` 31 | git clone https://github.com/safe-global/safe-smart-account && cd safe-smart-account && npm install 32 | ``` 33 | 34 | . Create a new wallet, copy its mnemonic, and paste it in the `.env` file alongside the RPC url of the Private Network in the `NODE_URL` parameter. For example, with https://book.getfoundry.sh/[Foundry, window=_blank]: 35 | + 36 | ``` 37 | cast wallet new-mnemonic 38 | ``` 39 | 40 | . Fund the wallet with native tokens (like Ether) via Tenderly. 41 | + 42 | image::guide-fund-private-network-relayer.png[Fund wallet on Private Network] 43 | 44 | . Paste the private key of the wallet and network RPC in the following command to deploy the CREATE2 Deployer contract. Copy the contract address in `contractAddress` for the next step. 45 | + 46 | ``` 47 | cast send --rpc-url NETWORK_RPC --private-key PRIVATE_KEY --create 0x604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3 48 | ``` 49 | 50 | . Replace the `deterministicDeployment` function in `hardhat.config.ts` with the following code, replacing `YOUR_CONTRACT_ADDRESS` and `YOUR_WALLET_ADDRESS`: 51 | + 52 | [source,jsx] 53 | ---- 54 | const deterministicDeployment = (): DeterministicDeploymentInfo => { 55 | return { 56 | factory: "YOUR_CONTRACT_ADDRESS", 57 | deployer: "YOUR_WALLET_ADDRESS", 58 | funding: BigNumber.from(100000).mul(BigNumber.from(100000000000)).toString(), 59 | signedTx: "0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf326a0b1fd9f4102283a663738983f1aac789e979e220a1b649faa74033f507b911af5a061dd0f2f6f2341ee95913cf94b3b8a49cac9fdd7be6310da7acd7a96e31958d7", 60 | }; 61 | }; 62 | ---- 63 | 64 | . Run the following command to deploy the Safe contracts (don't worry about the verification errors): 65 | + 66 | ``` 67 | npm run deploy-all custom 68 | ``` 69 | 70 | . Navigate to the https://defender.openzeppelin.com/v2/#/settings/networks/private[`Private Networks` page on Defender, window=_blank] and click on the edit button of the network you created. 71 | + 72 | image::guide-edit-private-network.png[Edit Private Network on Defender] 73 | 74 | . Copy the following addreses from the Safe contracts deployment output and paste them on Defender: 75 | * Safe Master Address: `Safe` 76 | * Safe Proxy Factory Address: `SafeProxyFactory` 77 | * Safe Multi-Send Call-Only Address: `MultiSendCallOnly` 78 | * Safe Create Call Address: `CreateCall` 79 | 80 | [[create-subgraph]] 81 | == 3. Create subgraph 82 | 83 | Subgraphs on Defender are powered by https://thegraph.com[TheGraph, window=_blank]. In order to create one for a Private Network, the network must be first supported by the TheGraph. https://github.com/graphprotocol/graph-tooling/blob/121843e982c69ffb31aae911431a68a2349ea062/packages/cli/src/protocols/index.ts#L91[Here's, window=_blank] the list of supported networks as data sources. Follow these steps to create a subgraph: 84 | 85 | . Clone the Defender subgraph toolkit repository and install the dependencies: 86 | + 87 | ``` 88 | git clone https://github.com/OpenZeppelin/defender-subgraphs && cd defender-subgraphs && yarn 89 | ``` 90 | 91 | . Follow the steps in the https://github.com/OpenZeppelin/defender-subgraphs/blob/main/README.md[README,window=_blank]. 92 | . Copy the subgraph URL and paste it in the `Subgraph URL` field on the Defender Private Network configuration. 93 | 94 | image::guide-subgraph-private-network.png[Subgraph URL on Defender] 95 | 96 | [[next-steps]] 97 | == Next steps 98 | 99 | Congratulations! You have successfully added a complete Private Network. You can now use it to deploy and test your smart contracts with the Safe contracts and subgraph. 100 | 101 | [[references]] 102 | == References 103 | 104 | * https://github.com/safe-global/safe-smart-account#deployments[Safe contracts deployments, window=_blank] 105 | * https://github.com/OpenZeppelin/defender-subgraphs[Defender subgraph toolkit, window=_blank] 106 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/guide/timelock-roles.adoc: -------------------------------------------------------------------------------- 1 | # How to manage roles of a TimelockController 2 | 3 | Defender allows you to oversee and command contract permissions of any smart contract that uses https://docs.openzeppelin.com/contracts/api/access#AccessControl[AccessControl from OpenZeppelin Contracts, window=_blank]. This guide will lead you through the steps of importing a TimelockController contract, creating a proposal, and managing its roles. A `TimelockController` is a smart contract that enforces a delay between when an operation is queued and when it can be executed. This mechanism is commonly used in decentralized governance to increase security and provide transparency, allowing stakeholders to observe and react to changes before they are executed. TimelockController uses the following `AccessControl`` setup: 4 | 5 | * The *Proposer* role is in charge of queueing operations: this is the role the Governor instance should be granted, and it should likely be the only proposer in the system. 6 | 7 | * The *Executor* role is in charge of executing already available operations: we can assign this role to the special zero address to allow anyone to execute (if operations can be particularly time sensitive, the Governor should be made Executor instead). 8 | 9 | * Lastly, there is the *Admin* role, which can grant and revoke the two previous roles: this is a very sensitive role that will be granted automatically to the timelock itself, and optionally to a second account, which can be used for ease of setup but should promptly renounce the role. 10 | 11 | [[pre-requisites]] 12 | == Pre-requisites 13 | 14 | * OpenZeppelin Defender account. You can sign up to Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 15 | 16 | [[timelock-controller]] 17 | == 1. Creating TimelockController 18 | 19 | First, you need to deploy a contract that implements `TimelockController`. For example, using OpenZeppelin Contracts 5.0: 20 | 21 | [source, solidity] 22 | ---- 23 | //SPDX-License-Identifier: Unlicense 24 | pragma solidity ^0.8.18; 25 | 26 | import "@openzeppelin/contracts/governance/TimelockController.sol"; 27 | 28 | contract Timelock is TimelockController { 29 | constructor(uint256 minDelay, address[] memory proposers, address[] memory executors) TimelockController(minDelay, proposers, executors, msg.sender) {} 30 | } 31 | ---- 32 | 33 | This contract will grant the *Admin* role to the deployer, and the *Proposer* and *Executor* roles to the accounts passed as arguments. If you want to grant the *Proposer* and *Executor* roles to the same account, you can pass the same address twice. After deploying the contract, copy its address and proceed to the next step. 34 | 35 | [[importing-to-defender]] 36 | == 2. Importing to Defender 37 | 38 | Navigate to the https://defender.openzeppelin.com/v2/#/address-book/new[Address Book on Defender, window=_blank] and add your contract with its address and network. If the contract is verified, Defender will automatically pick up the ABI. Otherwise, you need to https://gist.github.com/mverzilli/a35ab1b5bd7039167cc9270e9fd60632[paste the ABI, window=_blank] manually. 39 | 40 | [[create-a-proposal]] 41 | == 3. Creating a proposal 42 | 43 | xref:module/transaction-proposals.adoc[Defender Transaction Proposals] allows you to create and manage proposals. Proposals in turn can directly execute actions on schedule delayed execution of functions through the TimelockController contract. In order to create a new proposal, navigate to the https://defender.openzeppelin.com/v2/#/transaction-proposals/new?[Transaction Proposal creation page, window=_blank] and select your imported `TimelockController`. 44 | 45 | Then, select the `schedule` function from the functions dropdown and fill the information about the proposal you want to execute. For example: 46 | 47 | image::guide-timelock-roles-schedule.png[Proposal Data] 48 | 49 | Finally, select the approval process to send this proposal. This depends on who is the proposal of your `TimelockController` contract. For this guide, the proposer is an EOA wallet. With Defender, you can create an approval process that is connected to your EOA and send this proposal with it. 50 | 51 | image::guide-timelock-proposer.png[Proposer] 52 | 53 | You can then execute the proposal by creating another Transaction Proposal and selecting the `execute` function with the previous proposal data. 54 | 55 | [[granting-a-role]] 56 | == 4. Granting a role 57 | 58 | Now, you can use xref:module/access-control.adoc[Defender Access Control] to grant or revoke roles of your `TimelockController` contract. Navigate to https://defender.openzeppelin.com/v2/#/access-control/contracts[Access Control, window=_blank] and select your imported `TimelockController` contract. 59 | 60 | image::guide-timelock-roles.png[Timelock Controller Roles] 61 | 62 | In order to grant someone a role, you need to have access to the address that holds admin power over the role. For example, with the DEFAULT_ADMIN_ROLE, you can grant or revoke any role. In this case, you can use an EOA that holds the DEFAULT_ADMIN_ROLE to grant the PROPOSER_ROLE to another address. 63 | 64 | First, expand the dropdown of `PROPOSER_ROLE` and paste the address to grant the role to. 65 | 66 | image::guide-timelock-role-receiver.png[Receiver of role] 67 | 68 | Then, scroll down and use an approval process that holds the DEFAULT_ADMIN_ROLE to send the transaction, like an EOA wallet. Click on `Save Changes`, which will send the transaction to your wallet. 69 | 70 | image::guide-timelock-roles-grant.png[Grant a role] 71 | 72 | On the right side of the page, you will see that the transaction was executed and the role was granted to the address you selected. 73 | 74 | image::guide-timelock-roles-granted.png[Granted a role] 75 | 76 | [[revoking-a-role]] 77 | == Revoking a role 78 | 79 | To revoke a role, you need do the same steps but unselect the address to revoke the role from in the dropdown. 80 | 81 | image::guide-timelock-role-remover.png[Remover of role] 82 | 83 | Then, use the same approval process and save the changes. The transaction should be executed and the role revoked, as confirmed on the right side of the page. 84 | 85 | image::guide-timelock-role-revoked.png[Revoked role] 86 | 87 | [[references]] 88 | == References 89 | 90 | * xref:module/transaction-proposals.adoc[Transaction Proposals Documentation] 91 | * xref::module/access-control.adoc[Access Control Documentation] 92 | * https://docs.openzeppelin.com/contracts/governance#timelock[TimelockController Documentation, window=_blank] -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/guide/upgrade-actions-dependencies.adoc: -------------------------------------------------------------------------------- 1 | 2 | # Upgrading Actions Dependencies 3 | 4 | Actions must be kept updated with the latest Node.js runtime and dependencies versions to ensure they run in an up-to-date and secure environment. Occasionally, Node.js and dependencies versions get deprecated on Defender, which means that the Actions running on those Node.js versions (and related dependencies) must be upgraded to the latest ones to ensure they continue to function as expected. 5 | 6 | [[upgrade-process]] 7 | == Upgrade Process 8 | 9 | When there is a major Node.js version deprecation, the Defender team notifies users about this event and sets a deadline for upgrading actions to the latest dependency versions. If no action is taken by the deadline, Defender automatically upgrades the actions on behalf of users. 10 | 11 | WARNING: We encourage users to make the upgrade process by themselves as the automatic upgrade might introduce breaking changes in dependencies. 12 | 13 | [[how-to-upgrade-actions-runtimes]] 14 | == How to Upgrade Actions Runtimes 15 | 16 | 1. Check the Action https://docs.openzeppelin.com/defender/module/actions#environment[dependencies latest versions, window=_blank] and search for any breaking changes in your Action code. 17 | 2. Make any necessary code changes. 18 | 3. Test the Action code. A safe approach to do this: 19 | a. Create a new Action with the same code using the target dependencies version and run it to verify that it works as expected. 20 | b. If your action sends relayer transactions using https://docs.openzeppelin.com/defender/sdk[defender-sdk, window=_blank] (or any other Defender legacy package), validate that it works by connecting a testnet relayer with your action. 21 | 4. Once you have verified that the code and dependencies are compatible, upgrade the Action dependencies to the latest version. -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/guide/usage-notification.adoc: -------------------------------------------------------------------------------- 1 | = Manage custom and system usage notifications 2 | 3 | Defender enables you to receive notifications when your usage exceeds a certain threshold. This guide will walk you through the steps of setting up custom usage notifications and managing system usage notifications. Defender currently tracks usage metrics such as: 4 | 5 | * Monitor Alerts: The number of times your monitors have triggered an alert. 6 | * Action Runs: The number of times your actions have been executed. 7 | * Relayer Transactions: The number of transactions your relayers have processed. 8 | * Code Inspector Reports: The number of reports generated by Code Inspector. 9 | * Transaction Proposals: The number of proposals created. 10 | 11 | In addition, Defender provides default system usage notifications triggered when your usage exceeds 90% and 100%, respectively. For users with overages or metered billing enabled, only system usage notifications are triggered when usage surpasses 200%. These notifications are sent to the email addresses of all tenant administrator users. 12 | 13 | [[pre-requisites]] 14 | == Pre-requisites 15 | 16 | * OpenZeppelin Defender account. You can sign up for Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 17 | 18 | [[configure-usage-notification]] 19 | == 1. Configure a custom usage notification 20 | 21 | You will configure a custom usage notification for when your Action Runs usage exceeds 75% of your quota. You will set up an alert to be sent to all tenant administrators when this happens. To configure a custom usage notification, follow these steps: 22 | 23 | . Open https://defender.openzeppelin.com/v2/#/billing/settings[Defender Billing Settings, window=_blank] in a web browser. 24 | . Click on *Create Notification* in the top-right corner of the Notifications section. 25 | + 26 | image::guide-usage-notifications-all.png[Billing Settings] 27 | + 28 | . In the *Create Notification* dialog: 29 | ** Enter a name for the notification. For example, `Action Runs Usage 75%`. 30 | ** Select the usage metric you want to monitor. In this case, select `Action Runs`. 31 | ** Set the threshold to 75. Below, you will see the current usage and the absolute value of the threshold for the selected metric. 32 | ** Select the "All Tenant Administrators" notification channel. For now, your selection is limited to **Slack** and **Email**. 33 | + 34 | image::guide-usage-notifications-create.png[Usage Notification Create Dialog, width=400] 35 | 36 | At any time, you may pause or unpause usage notifications. You can do this by toggling the switch next to the notification name. You can also manage your notifications by clicking on the three dots next to the notification threshold. From the dropdown menu, you can edit or delete the notification. System usage notifications can only be paused. 37 | 38 | image::guide-usage-notifications-edit-menu.png[Manage Notification] 39 | 40 | [[manage-system-usage-notification]] 41 | == 2. Pause a system usage notification 42 | 43 | You will pause a system usage notification for when Monitor Alerts usage exceeds 90% (or 200% for users with overages enabled) of your quota. If overages are enabled for your account, you will see the *Surpassing* notifications. Otherwise, you will only see the *Nearing* and *Exceeding* notifications. 44 | 45 | To pause a system usage notification, follow these steps: 46 | 47 | . Open https://defender.openzeppelin.com/v2/#/billing/settings[Defender Billing Settings, window=_blank] in a web browser. 48 | . Filter the notifications table by selecting the "System" tab. 49 | . Locate the *Nearing Monitor Alerts* or *Surpassing Monitor Alerts* notification. 50 | . Toggle the switch to pause the notification. 51 | 52 | image::guide-usage-notifications-system-unmetered.png[Nearing Monitor Alerts] 53 | 54 | image::guide-usage-notifications-system.png[Surpassing Monitor Alerts] 55 | 56 | NOTE: If a user disabled system notifications from their profile, they will also be opted out of all system notifications, regardless of their individual paused state. 57 | 58 | image::guide-profile-disable-system-notifications.png[Disable System Notifications] 59 | 60 | [[next-steps]] 61 | == Next steps 62 | 63 | Congratulations! You have successfully set up a custom usage notification. Once your Action Runs usage exceeds the 75% threshold, all your tenant administrators will receive an email notification. In addition, you have paused the default system usage notification for when Monitor Alert exceeds the 90% (or 200% for users with overages enabled) threshold. Therefore, your tenant administrators will no longer receive a system email notification when this happens. -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/index.adoc: -------------------------------------------------------------------------------- 1 | = Defender 2 | 3 | OpenZeppelin Defender is a mission-critical developer security platform to *code*, *audit*, *deploy*, *monitor*, and *operate* blockchain applications with confidence. 4 | 5 | Integrating directly into the developer workflow, Defender makes it easy and fast for developers and operators to prevent and fix security issues pre and post-deployment. 6 | 7 | == Subscriptions 8 | Defender offers flexible subscriptions to match your team’s needs and support your project at any scale. 9 | 10 | - *Builder (Free)* - Suitable for individuals and small projects that are getting started on testnets and need access to all basic features with limited quotas. 11 | - *Professional* - For mature projects running on mainnets that need access to premium features, higher quotas and metered billing, as well as access to OpenZeppelin support and SLA. 12 | - *Enterprise* - For large projects with higher volumes that need a custom plan to meet their project needs, with higher quotas, access to all premium and security features, and a dedicated support channel. 13 | 14 | Defender also offers a free 14-day trial that you can enable at any point to try the premium features included in our Professional and Enterprise subscriptions. For more information, check out the Defender 15 | 16 | https://www.openzeppelin.com/pricing[pricing page] 17 | 18 | [[modules]] 19 | [.card-section.card-section-2col] 20 | == Modules 21 | 22 | Defender modules work seamlessly together, providing users powerful features and a superior, integrated experience. Learn more about each module by clicking on its card. 23 | 24 | [.card.card-learn] 25 | -- 26 | xref:module/code.adoc[[.card-title]#Code Inspector# [.card-body]#pass:q[Automatic code analysis powered by AI models and tools developed by our security experts.]#] 27 | -- 28 | 29 | [.card.card-learn] 30 | -- 31 | xref:module/audit.adoc[[.card-title]#Audit# [.card-body]#pass:q[Manage the smart contract audit process and track issues and resolutions.]#] 32 | -- 33 | 34 | [.card.card-learn] 35 | -- 36 | xref:module/deploy.adoc[[.card-title]#Deploy# [.card-body]#pass:q[Manage deployments and upgrades to ensure secure releases.]#] 37 | -- 38 | 39 | [.card.card-learn] 40 | -- 41 | xref:module/relayers.adoc[[.card-title]#Relayers# [.card-body]#pass:q[Send transactions to the blockchain via Defender automatically.]#] 42 | -- 43 | 44 | [.card.card-learn] 45 | -- 46 | xref:module/monitor.adoc[[.card-title]#Monitor# [.card-body]#pass:q[Detect smart contract activity and anomalies through trigger actions and alerts.]#] 47 | -- 48 | 49 | [.card.card-learn] 50 | -- 51 | xref:module/transaction-proposals.adoc[[.card-title]#Transaction Proposals# [.card-body]#pass:q[Create transactions to be executed on-chain.]#] 52 | -- 53 | 54 | [.card.card-learn] 55 | -- 56 | xref:module/actions.adoc[[.card-title]#Actions# [.card-body]#pass:q[Create automated actions to perform on-chain and off-chain operations.]#] 57 | -- 58 | 59 | [.card.card-learn] 60 | -- 61 | xref:module/address-book.adoc[[.card-title]#Address Book# [.card-body]#pass:q[Create a shared repository of user-friendly names for your accounts or contracts.]#] 62 | -- 63 | 64 | [.card.card-learn] 65 | -- 66 | xref:module/access-control.adoc[[.card-title]#Access Control# [.card-body]#pass:q[Manage smart contract accounts, roles, and permissions easily.]#] 67 | -- 68 | 69 | [[networks]] 70 | == Available networks 71 | Defender works with most mainnet and testnet networks, as well as local mainnet forks. 72 | 73 | - https://arbitrum.io/[*Arbitrum One*], https://nova.arbitrum.io/[*Arbitrum Nova*,window=_blank], *Arbitrum Sepolia*. 74 | - https://aurora.dev/[*Aurora*,window=_blank] and *Aurora Testnet*. 75 | - https://docs.avax.network/dapps[*Avalanche C*,window=_blank] and *FUJI C-Chain*. 76 | - https://www.base.org/[*Base Mainnet*,window=_blank] and *Base Sepolia*. 77 | - https://docs.binance.org/smart-chain/guides/bsc-intro.html[*Binance Smart Chain*,window=_blank] and *BSC testnet*. 78 | - https://celo.org/[*Celo*,window=_blank] and *Alfajores*. 79 | - https://ethereum.org/en/[*Ethereum Mainnet*, window=_blank], *Sepolia* testnet and *Holesky* testnet. 80 | - https://fantom.foundation/what-is-fantom-opera/[*Fantom*,window=_blank] and *Fantom Testnet*. 81 | - https://fuse.io/[*Fuse*,window=_blank]. 82 | - https://www.gnosis.io/[*Gnosis Chain*,window=_blank] 83 | - https://hedera.com/[*Hedera*,window=_blank] and *Hedera Testnet*. 84 | - https://www.japanopenchain.org/en/docs/developer/mainnet[*Japan Open Chain*,window=_blank] and *Japan Open Chain Testnet*. 85 | - https://linea.build/[*Linea Mainnet*,window=_blank] and *Linea Sepolia*. 86 | - https://scroll.io/[*Scroll Mainnet*, window=_blank] and *Scroll Sepolia*. 87 | - https://www.mantle.xyz/[*Mantle Mainnet*, window=_blank] and *Mantle Sepolia*. 88 | - https://www.meld.com/[*Meld Mainnet*, window=_blank] and *Meld Testnet*. 89 | - https://moonbeam.network/[*Moonbeam*,window=_blank], *Moonriver*, and *Moonbase Alpha (Testnet)*. 90 | - https://optimism.io/[*OP Mainnet*,window=_blank], *OP Sepolia*. 91 | - https://www.polygon.technology/[*Polygon* (POL),window=_blank], *Amoy*, https://polygon.technology/polygon-zkevm[*zkEVM*, window=_blank] and *Polygon Cardona zkEVM testnet* 92 | - https://scroll.io/[*Scroll Mainnet*, window=_blank] and *Scroll Sepolia*. 93 | - https://www.unichain.org/[*Unichain*, window=_blank] and *Unichain Sepolia*. 94 | - https://zksync.io/[*zkSync Era Mainnet*,window=_blank] and *zkSync Era Sepolia*. 95 | - https://www.playongeist.com//[*Geist Mainnet*, window=_blank] and *Polter Testnet*. 96 | - https://docs.abs.xyz/overview[*Abstract Mainnet*,window=_blank] and *Abstract Sepolia*. 97 | - https://www.peaq.network/[*Peaq Mainnet*, window=_blank] and *Peaq Agung*. 98 | 99 | If there is any other network or layer-2 solution you would like to use from Defender, please xref:index.adoc#feedback[reach out to us via the form on Defender]! 100 | 101 | [[network-status]] 102 | === Status 103 | You can check the status of Defender and the supported networks on our https://status.defender.openzeppelin.com/[status page, window=_blank], where you can also subscribe to receive notifications. If a supported network experiences issues, some features in Defender for that network may not work properly. 104 | 105 | [[integrations]] 106 | == Integrations 107 | Integrations throughout Defender allow users to connect with other services and tools. Find the list of integrations and more information xref:integrations.adoc[here]. 108 | 109 | [[sla]] 110 | == Service Level and Support Agreement 111 | For our https://www.openzeppelin.com/pricing[paid subscriptions, window=_blank], we're offering enhanced service reliability, guaranteed uptime, and priority support. You can learn more on our https://www.openzeppelin.com/service-level-agreement[Service Level and Support Agreement (SLA) page, window=_blank]. 112 | 113 | [[feedback]] 114 | == Feedback 115 | 116 | As a Defender user, your feedback is important! Please provide us feedback by accesing the form on the bottom-right corner of your screen. 117 | 118 | image::feedback-button.png[Feedback form button bottom-right corner] 119 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/integrations.adoc: -------------------------------------------------------------------------------- 1 | [[Integrations]] 2 | = Integrations 3 | 4 | Defender seamlessly integrates with your existing tools and workflows, so you can easily secure your project throughout the secure development lifecycle. 5 | 6 | [[sdk]] 7 | == SDK Plugins 8 | - https://hardhat.org/[*Hardhat*, window=_blank]: Code, deploy and upgrade your Hardhat projects through Defender. 9 | - https://getfoundry.sh/[*Foundry*, window=_blank]: Code your Foundry projects with support of Defender. 10 | 11 | [[ide]] 12 | == IDEs 13 | - https://remix.ethereum.org/[*Remix*, window=_blank]: Deploy your Remix contracts using Defender deployment environments through the Defender Remix Plugin. 14 | 15 | [[libraries]] 16 | == Libraries 17 | - https://www.openzeppelin.com/contracts[*OpenZeppelin Contracts*, window=_blank]: Speed up your smart contract development with security and performance baked in. 18 | 19 | [[continous-integration]] 20 | == Continuous Integration 21 | - xref:module/code.adoc[*GitHub*]: Install Code Inspector to maximize security in every project PR. 22 | - xref:dac.adoc[*Defender as Code (DaC)*]: Serverless Framework plugin for automated resource management. 23 | 24 | [[key-management-transaction-execution]] 25 | == Key Management & Transaction Execution 26 | - https://app.safe.global/[*Safe*, window=_blank]: Use Safe multisigs to approve Defender operations. 27 | - https://www.fireblocks.com/[*Fireblocks*, window=_blank]: Use Fireblocks assets to approve Defender operations. 28 | - https://www.flashbots.net/[*Flashbots*, window=_blank]: Send private transactions to prevent MEV and other attack vectors. 29 | 30 | [[notification-and-logging]] 31 | == Notification & Logging 32 | - https://www.datadoghq.com/[*Datadog*, window=_blank]: Push notifications and logs to your Datadog system. 33 | - https://www.pagerduty.com/[*PagerDuty*, window=_blank]: Configure PagerDuty to receive notifications and trigger operations. 34 | - https://www.atlassian.com/software/opsgenie[*Opsgenie*, window=_blank]: Configure Opsgenie to receive notifications for their alert management services. 35 | - https://slack.com/[*Slack*, window=_blank]: Configure Slack channels to receive notifications. 36 | - https://telegram.org/[*Telegram*, window=_blank]: Configure Telegram bots to receive notifications. 37 | - https://discord.com/[*Discord*, window=_blank]: Configure Discord channels to receive notifications. 38 | - *Webhooks*: Configure any Webhook to manage any type of alert with complete flexibility. 39 | - *Email*: Receive alerts via any Email. 40 | 41 | [[threat-detection-and-transaction-data]] 42 | == Threat Detection & Transaction Data 43 | - https://etherscan.io/[*Etherscan*, window=_blank]: Visualize transactions from Defender using Etherscan-based explorers. 44 | - https://www.blockscout.com/[*Blockscout*, window=_blank]: Visualize transactions from Defender using Blockscout-based explorers. 45 | 46 | [[source-code]] 47 | == Source Code 48 | - https://github.com/[*Github*, window=_black]: Install our xref:module/code.adoc[Code Github application] to scan your project with every pull request to identify potential vulnerabilities and suggest improvements to enhance your code quality. 49 | 50 | If there is any other integration you would like, please xref:index.adoc#feedback[reach out to us via the form on Defender]! 51 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/logs.adoc: -------------------------------------------------------------------------------- 1 | [[logs]] 2 | = Logs 3 | 4 | Defender generates log trails of every potentially relevant event in the system. This includes manual actions, such as modifying an Action or Monitor, as well as automated activity, such as sending a transaction or firing a notification. Logs can be optionally forwarded to Datadog and Splunk for aggregation or exported. 5 | 6 | [[use-cases]] 7 | == Use cases 8 | 9 | * Track user actions on your team by monitoring sign ins and activity across the application 10 | * Detect potential attacks on your infrastructure from failed sign in attempts 11 | * Follow relayer activity to understand the transactions being sent from your accounts 12 | * Keep an audit trail of all module configuration changes 13 | * Filter by severity, type, user, module, time, and more 14 | 15 | == Log Entries 16 | 17 | Every log entry is structured with the following format: 18 | 19 | * `Module`: The origin of the log entry, such as Monitor, Actions, Workflows, Deploy, etc. 20 | * `Date and Time`: The day and time the log entry was generated with the format `Day Month Year` and 12-hour clock format in the browser local timezone 21 | * `Severity`: The severity level of the log entry, ranging from `trace` to `error` 22 | * `Subject`: The trigger/cause that generated the log. If contract related, the contract name is displayed 23 | * `Event`: Type of acitivty logged. For example, `Created`, `Added`, `Deledated`, `Updated`, etc. 24 | * `Description`: Details on the event. For example, `Contract was updated`, `Address book entry was updated`, etc. 25 | * `User`: Team user that generated the log entry, directly or indirectly 26 | 27 | image::logs.png[Logs Page] 28 | 29 | You can click on each log entry to get a detailed view, which includes the tenant id, user id, activity response, request, log id, timestamp, and more. 30 | 31 | image::logs-detailed.png[Logs Detailed View] 32 | 33 | == Log Forwarding 34 | 35 | Generated logs can be forwarded to Datadog and Splunk, or any other service that supports API Key authentication. You can use this to aggregate all logs across your infrastructure in a single place. 36 | 37 | == Setup Log Forwarding Destination 38 | 39 | To set up a log forwarding destination, open the Logs page and click the 'Send Logs to an External Service' button. 40 | 41 | Form fields: 42 | 43 | * *URL* field is a required field. All logs are forwarded to this URL address using HTTP POSTs. 44 | 45 | * *API Header Name* is optional. This is the name of the request header that contains the API Key value. Most log management services require it. Please refer to your log management service documentation to determine if you need it. 46 | 47 | * *API Key* is an optional field. API Key is sent with every request for authentication purposes. Most log management services require it. Please refer to your log management service documentation to determine if you need it. 48 | 49 | * *Log Types* lets you specify which subset of Defender generated logs you want to have forwarded based on Defender components. 50 | 51 | * *Log Levels* lets you specify which subset of Defender generated logs you want to have forwarded based on the log levels. For example debug logs can be used for Autotasks debugging purposes and they can contain data that should not be exported to external systems. 52 | 53 | NOTE: In the next section we will cover how to setup Log Forwarding with Splunk and Datadog but it is worth noting that Log Forwarding works with any other service that supports API Key authentication. 54 | 55 | === Splunk 56 | 57 | Forwarding logs to Splunk is done by using Splunk HEC(HTTP Event Collector). 58 | Documentation for setting up logging with Splunk HEC can be found https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector[here,window=_blank]. 59 | 60 | NOTE: Log Forwarding does not work with Splunk trial accounts because of Splunk internals. 61 | 62 | Example: 63 | 64 | * *URL*: `\https://username.splunkcloud.com/services/collector/raw` 65 | 66 | * *API Header Name*: `Authorization` 67 | 68 | * *API Key*: `Splunk xxxxxxxxxxxxxxxxxxxxxxxxxxx` 69 | 70 | NOTE: `URL` value is dynamic as URL includes account username. 71 | 72 | NOTE: `API Key` should contain `Splunk` prefix. 73 | 74 | 75 | === Datadog 76 | 77 | Documentation for setting up logging on Datadog can be found https://docs.datadoghq.com/logs/[here,window=_blank]. 78 | 79 | 80 | Example: 81 | 82 | * *URL*: `\https://http-intake.logs.datadoghq.com/api/v2/logs` 83 | 84 | * *API Header Name*: `DD-API-KEY` 85 | 86 | * *API Key*: `xxxxxxxxxxxxxxxxxxxxxxxxxxx` 87 | 88 | NOTE: Datadog uses different sites around the world. For example, if you are relying on an EU server the `URL` field value should be https://http-intake.logs.datadoghq.eu/api/v2/logs 89 | 90 | NOTE: `API Key` value can be obtained from Datadog site by opening `Logs` section from the left menu. 91 | Go to `Cloud` section and select `AWS` provider. 92 | After following those steps, the `API Key` value is displayed in the bottom section of the page. 93 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/module/access-control.adoc: -------------------------------------------------------------------------------- 1 | [[access-control]] 2 | = Access Control 3 | 4 | Access control allows you to seamlessly oversee and command contract permissions on a grand scale, with the power to view and control access at a granular level. Currently supports https://docs.openzeppelin.com/contracts/4.x/access-control#ownership-and-ownable[ownable, window=_blank] and https://docs.openzeppelin.com/contracts/4.x/access-control#role-based-access-control[role-based, window=_blank] access control. 5 | 6 | IMPORTANT: At this time, access control is supported across all networks except *Hedera*, *Fantom Testnet* and *Arbitrum Nova*. 7 | 8 | [[use-cases]] 9 | == Use cases 10 | 11 | * Manage ownership of contracts and proxies, including the ability to transfer ownership to a multisig or DAO 12 | * Identify roles, and remove or give permissions to addresses through multisigs or wallets 13 | * Import contracts from the supported networks, or use contracts deployed through Defender. 14 | 15 | [[contracts]] 16 | == Contracts 17 | 18 | The main page shows all your contracts from the xref:module/address-book.adoc[Address Book] that have an access control interface supported. You can also add an existing contract to the Address Book by clicking on the "Add new contract" button. This is a one-time form where you specify the network, address and name. The contract's ABI will be automatically pulled from the respective block explorers if available. If not, you will have to enter the ABI manually. When a contract is added, the main page will update and show it if applicable. 19 | 20 | image::access-control.png[Access control main page] 21 | 22 | - Not Ownable: contract has no ownership interface 23 | - Ownable: current owner address 24 | - Roles: number of roles found in the contract 25 | 26 | [[contract]] 27 | == Contract 28 | 29 | The contract page contains all the information about the contract selected, including the name, environment, network, address, and roles found. Defender performs on-chain syncs with the contract every minute, with the last sync time found on the top right of the page. 30 | 31 | Access control automatically tries to fetch all roles within a contract, but there's the possibility of missing some. In this case, you can add a role manually by clicking on the "Add new role" button and specifying the name of it. 32 | 33 | When modifying a role, you have to choose which admin address to use. In the case of a multisig as admin, the transaction to modify the role will be wrapped into a proposal, which will be pending until approved by the other signers (if any) and executed. You can see the pending proposals on the right side of the page. 34 | 35 | image::access-control-contract.png[Access control contract page] 36 | 37 | NOTE: We provide a quickstart tutorial to change access control roles using Defender. Check it out xref:tutorial/access-control.adoc[here]! 38 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/module/address-book.adoc: -------------------------------------------------------------------------------- 1 | [[address-book]] 2 | = Address Book 3 | 4 | The Address Book allows you to create a shared repository of user-friendly names for your accounts or contracts. You can set up these names anywhere you see an address in Defender just by clicking on it, or you can manage your entire Address Book in the dedicated section. Defender automatically creates Address Book entries for you when you import accounts and contracts in other modules. 5 | 6 | When working with products in Defender, account and contract information will be directly sourced from the Address Book whenever you are required to enter an address, so you can easily fetch addresses from your Address Book when configuring monitors and actions. 7 | 8 | image::manage-address-book.png[Manage Address Book] -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/module/audit.adoc: -------------------------------------------------------------------------------- 1 | [[audit]] 2 | = Audit 3 | 4 | Audit allows you to summon our team of security experts to verify your system works as intended with the highest level of scrutiny. You can track issues and resolutions, and interact directly with auditors for faster and more efficient communication. 5 | 6 | [[use-cases]] 7 | == Use cases 8 | 9 | * Maintain a searchable repository of all smart contract audits and issues. 10 | * Streamline the interactions between auditors and developers. 11 | * Automate the fix-review process for all identified issues. 12 | * Track all issues identified in an audit to completion. 13 | 14 | [[audit-reports]] 15 | == Auditors and Reports 16 | 17 | Auditors have special roles in Defender. Audit Managers are able to sync audit reports to Defender from GitHub and add the Auditors, which are able to read and track issues and questions. Audit Manager can also identify which members of your team have permission to read or comment on audits. 18 | 19 | Once an Audit Manager syncs and delivers an audit report to Defender, it will be visible to any team members who have been assigned the Audit Read or Audit Comment role. All active and historic audit reports will be visible, and team members can click on any audit report to view the details. 20 | 21 | image::audit-status.png[Audit Status Header] 22 | 23 | The Audit page initially includes the project's name, status, and date of report. Below this, you can find the executive summary of the audit, which provides an overview of the audit's findings and the overall security posture of the smart contract or project. It also includes links and information on the scope, timeline, and Auditors. 24 | 25 | Below the executive summary, you can find the differente sections of the audit. 26 | 27 | === Overview 28 | 29 | The "Overview" section provides context and background information about the project or smart contract being audited. This section typically starts with a brief introduction to the project, including the project's name, purpose, and a general description of what it aims to achieve. It's followed by an overview of the architecture and key components of the project, supported by a high-level description of how the smart contract or blockchain application is structured and how different modules or components interact with each other. Information about the technology stack used in the project may be included. This can encompass the programming languages, libraries, frameworks, and blockchain platforms employed in the development. 30 | 31 | Depending on the audit, this section may also contain additional information about the smart contract's privileged roles to explain its purpose and responsibilities within the project. This helps auditors and readers understand who has control over critical functions and what actions they can perform. Similarly, trust assumptions are commonly mentioned to outline implicit or explicit assumptions made by the project's developers about the security and reliability of external components, services, or entities that the project relies on. Lastly, the "Overview" section may include client-found vulnerabilities if provided by the client. These are vulnerabilities or issues that have been identified by the project's users or clients before the audit, helping the auditors understand the context and history of security concerns related to the project. 32 | 33 | === Issues 34 | 35 | The "Issues" section provides an in-depth examination of security vulnerabilities, bugs, or concerns discovered during the audit process. Within this section, you can filter the issues by content, severity, or status. Filtering by content allows you to look for issues with specific titles or descriptions. Filtering by severity allows you to look for issues with a specific severity level, like Critical, High, Medium, Low, Note, or Client Reported. Filtering by status allows you to look for issues with a specific status, like Unresolved, No Response, Responded, Resolved, Partially Resolved, Acknowledged Not Resolved, or Acknowledged Will Resolve. 36 | 37 | image::audit-filter.png[Audit Issue Filters] 38 | 39 | Each issue within this section contains a title, description, date, and status. You can click on one to expand the information and be able to respond to it. 40 | 41 | image::audit-side.png[Audit Side Page] 42 | 43 | The description explains the nature of the issue, its potential impact, and any technical details necessary for understanding the problem. The issue is also tagged with a severity assessment, helping to describe the impact, likelihood, and difficulty of an issue for prioritization and transparency. 44 | 45 | === Recommendations 46 | 47 | The "Recommendations" section offers actionable guidance to improve the security posture of the project based on the audit results. This section is often composed of mitigation strategies, monitor recommendations, incident response plans, potential pitfalls, and other technical and non-technical advice. 48 | 49 | Monitoring and incident response recommendations included in this section are crucial for ensuring the ongoing security and resilience of your blockchain project or smart contract. These recommendations focus on proactive measures to detect and respond to security incidents, breaches, or anomalies effectively. The information given will provide details on how to apply these recommendations with Defender xref:module/monitor.adoc[Monitors], xref:module/actions.adoc[Actions], and xref:module/actions.adoc#workflows[Workflows]. We recommend following the tutorials found in this documentation to learn how to use the Defender modules, like the xref:tutorial/monitor.adoc[Monitor], xref:tutorial/actions.adoc[Actions], and xref:tutorial/workflows.adoc[Workflow] tutorials. 50 | 51 | Recommendations often include: 52 | 53 | * *Event Monitoring*: event monitoring to track and analyze events emitted by your smart contracts. This is essential for identifying unusual or unexpected behavior that may indicate a security issue. 54 | * *Custom Alerts*: Custom alerts based on specific conditions or events. This aligns with the incident response recommendation to have alerting mechanisms in place. 55 | * *Automated Response*: Automated responses to specific events or conditions, enabling rapid incident mitigation. Combined with xref:module/actions.adoc[Actions] and xref:module/actions.adoc#workflows[Workflows]. 56 | * *Threshold Monitoring*: Monitoring for unusual deviations from established thresholds is a common incident response practice. Defender can assist in setting up threshold-based monitoring with xref:module/monitor.adoc[Monitors] and to react with automatic xref:module/actions.adoc#workflows[Workflows]. 57 | * *Deployment Considerations*: Minimize risk while avoiding unnecessary delays and post-deployment using Defender xref:module/deploy.adoc[Deploy]. Employ automatic analysis to avoid storage collisions or other issues and benefit from features like cross-chain deterministic deployments, bytecode verification, and more. 58 | 59 | === Conclusion 60 | 61 | The "Conclusion" section summarizes the audit's findings and provides an overall assessment of the project's security posture. This section begins with a concise summary of the key findings from the audit, including a recap of critical security vulnerabilities, issues, or concerns discovered during the assessment with the security levels assigned to each identified issue, helping stakeholders understand which issues posed the highest risks. Depending on the issues found, the "Conclusion" section may also restate the high-priority recommendations for addressing issues, emphasizing the immediate actions needed to enhance security. 62 | 63 | This section will also communicate the risks associated with the project's current security status to help project owners, investors, and users make informed decisions. Additional valuable insights may be provided to support certain decisions by stakeholders, such as deployment, further development, and improvements. If recommendations were provided, these will be restated in this section as a high-level overview. 64 | 65 | [[fix-review]] 66 | == Fix-Review process 67 | 68 | After an audit report is delivered, the individual issues within a report are open to response and comment until they are each finalized by an Audit Manager. Auditors and team members assigned the Audit Comment role are allowed to respond and comment. Team members may ask questions to Auditors or supply information. 69 | 70 | In order to initiate a response on an issue, click on the issue within the "Issues" section of the audit page and then click on "Reply to this issue". 71 | 72 | image::audit-new-issue.png[Audit Issue Response] 73 | 74 | Team members may leave comments for auditors. Specifically, team members can supply links to pull requests (PRs) or commits in their GitHub repository, which represent fixes associated with a specific issue. Multiple links may be added. 75 | 76 | image::audit-reply-issue.png[Audit Issue Reply] 77 | 78 | Defender will keep and display a trail of all communications between the auditors and team members on each issue. 79 | 80 | image::audit-trail.png[Audit Trail] 81 | 82 | Depending on the outcome of fixes and reviews, auditors may update the status of issues to Partially Resolved or Resolved. Once the fix-review process is complete for all issues, the Audit Manager will finalize the audit, after which the full trail of activity is visible, but no more responses or comments are allowed. At the end of the audit, the Audit Manager can also provide a PDF report of the audit, including the fix-review process. 83 | 84 | For any questions regarding your audit process, please get in touch with your assigned Audit Manager. You can provide Defender feedback via xref:index.adoc#feedback[its feedback form] — your comments and suggestions will be instrumental in helping us shape the future of the Audit module! -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/module/deploy.adoc: -------------------------------------------------------------------------------- 1 | [[deploy]] 2 | = Deploy 3 | 4 | Deploy allows you to deploy and upgrade smart contracts across chains securely. You can prove that the code running on-chain matches the audited implementation and minimize crucial mistakes that can lead to losses or issues. 5 | 6 | [[use-cases]] 7 | == Use cases 8 | 9 | * Configure production and test environments with granularity over deployer addresses. 10 | * Pay gas for deployments automatically. 11 | * Ensure all smart contract deployments are verified on block explorers. 12 | * Manage deployments to multiple chains from a single place. 13 | * Automate multisig approval process for upgrades. 14 | * Fully compatible with CI/CD for automated releases. 15 | * Track the details and history for every deployment or upgrade. 16 | 17 | [[environments]] 18 | == Environments 19 | 20 | Deploy is divided into production and test environments, with mainnet networks for the former and testnet networks for the latter. Each environment is associated with one or more networks according to its type of environment, which allows to separate test contracts from production safely. To facilitate the onboarding process, the setup for each environment is configured through a wizard, which swiftly walks you through the following steps. 21 | 22 | [[wizard]] 23 | === Wizard 24 | 25 | [[wizard-1]] 26 | ==== Step 1: Networks 27 | 28 | In the first step, you select the networks to use. Deploy supports multi-chain deployments, allowing users to deploy contracts to the same addresses across multiple networks. You can add or remove networks at any time through the environment page. 29 | 30 | NOTE: To maintain the best security practices, the wizard will only show networks according to the type of environment chosen to prevent mixing networks. 31 | 32 | [[wizard-2]] 33 | ==== Step 2: Deploying 34 | 35 | In this step, users choose the default approval process for each network. The resource associated to this approval process is the one that will be used to pay and execute the deployment transactions. If you don't have an approval process for a network, the wizard will allow you to create one of either type Relayer, Safe or EOA ("Externally Owned Account"). You can learn more about approval processes xref:settings.adoc#approval-processes[here]. 36 | 37 | [[wizard-3]] 38 | ==== Step 3: Upgrading 39 | 40 | This last step is optional but recommended if you plan to deploy upgradeable contracts. Here you choose the approval process for upgrades for each network. You can find a list of supported processes xref:settings.adoc#approval-processes[here]. 41 | 42 | [[wizard-4]] 43 | 44 | [[environment]] 45 | == Environment Page 46 | 47 | Once inside an environment, you can see the configuration and activity of deployments within it. 48 | 49 | [[configuration]] 50 | === Configuration 51 | 52 | You can edit the configuration of any network within the environment. To do so, click the edit button to reach the configuration page, where you can add or remove a network and change the default approval processes. We use system block explorer API keys to automatically verify contracts on Etherscan. You can manage your own keys in the configuration page. 53 | 54 | [[history]] 55 | === History 56 | 57 | The history table shows the activity within the environment, allowing you to check the status of deployments or upgrades. There are three possible statuses: 58 | 59 | * `COMPLETE`: The deployment has been successfully executed in the network. 60 | * `PENDING`: The upgrade is waiting for approval. 61 | * `FAILED`: The deployment has failed. Make sure the relayer or EOA associated to the approval process has enough funds and that the smart contract is valid. 62 | 63 | [[deployments]] 64 | == Deploying and Upgrading 65 | 66 | After an environment is configured, you can use it for deployments and upgrades. To do so, we provide an https://www.npmjs.com/package/@openzeppelin/defender-sdk-deploy-client[API, window=_blank], and https://www.npmjs.com/package/@openzeppelin/hardhat-upgrades[Hardhat, window=_blank] and https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades[Foundry, window=_blank] plugins. The Deploy API is recommended for custom projects that don't use Hardhat or Foundry. On the other hand, the plugins are extremely easy to use as they only require a few lines of code to implement. 67 | 68 | Defender will use the default approve process for deployments and upgrades. However, the Hardhat and Foundry plugins allow you to specify a different approval process for upgrades. If a block explorer API key is not provided, Defender will try to verify the contracts with the default key. Otherwise, it will use the one provided. 69 | 70 | NOTE: We provide a quickstart tutorial to deploy and upgrade a smart contract using Defender with Hardhat and Foundry. Check it out xref:tutorial/deploy.adoc[here]! 71 | 72 | WARNING: Using `CREATE2` may affect `msg.sender` behavior; see documentation for details xref:tutorial/deploy.adoc#deploy-caveat[here]! 73 | 74 | [[metadata]] 75 | == Metadata 76 | 77 | To identify, tag, or classify deployments, you can use the `metadata` field, which includes properties like `commitHash`, `tag`, or any custom property that suits your use case. 78 | 79 | ```js 80 | const client = new Defender({ 81 | apiKey: process.env.API_KEY, 82 | apiSecret: process.env.API_SECRET, 83 | }); 84 | 85 | const deployment = await client.deploy.deployContract({ 86 | contractName: 'Example', 87 | ... 88 | metadata: { 89 | commitHash: '4ae3e0d', 90 | tag: 'v1.0.0', 91 | anyOtherField: 'anyValue', 92 | }, 93 | }); 94 | ``` 95 | 96 | Once the deployment is submitted, these metadata fields will be displayed in the Defender UI under _Metadata_, formatted in JSON. 97 | 98 | image::deploy-metadata-1.0.png[Deploy Metadata] -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/module/transaction-proposals.adoc: -------------------------------------------------------------------------------- 1 | [[transaction-proposals]] 2 | = Transaction Proposals 3 | 4 | Transaction Proposals are very similar to actions, but instead of having to write the javascript code, you can use a form-based editor to define the transaction parameters. + 5 | This low-code format is very useful for non technical users and simple scenarios, but lacks the flexibility of the Actions. If you need to invoke external APIs or contracts, or perform more complex logic, you should use the xref:module/actions.adoc[Actions] instead. 6 | 7 | [[general-information]] 8 | == General Information 9 | To create a Transaction Proposal from Defender, you need to define a few parameters: 10 | 11 | * Title: A descriptive name for the proposal. This will be latter shown in the proposal list. 12 | * Description(optional): A longer description of the proposal. This will be shown in the proposal details. 13 | * Target Contract: The smart contract that you want to run the transaction on. 14 | 15 | NOTE: If you have trouble connecting your wallet to Defender, there may be a conflict between wallet extensions if multiple are installed. 16 | 17 | [[function]] 18 | == Function 19 | Define the function that you want to call on the target contract. You can select from a list of functions that are available on the contract interface. If the function has parameters, you can define them here. 20 | 21 | [[approval-process]] 22 | == Approval Process 23 | Define how you want the transaction to be executed. You can choose from any of the xref:settings.adoc#approval-processes[transaction approval processes] available in Defender that you have previously configured or you can optionally create a new one. 24 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/remix-plugin.adoc: -------------------------------------------------------------------------------- 1 | [[remix-plugin]] 2 | = Remix Plugin 3 | 4 | When coding and compiling contracts from https://remix.ethereum.org/[Remix IDE, window=_blank], you can use Defender Plugin to deploy your contracts by configuring a xref:module/deploy.adoc[Deployment Environment] and using an Approval Process as deployer. 5 | 6 | [[installation]] 7 | == Installation 8 | 9 | 1. Go to https://remix.ethereum.org/[Remix IDE, window=_blank] and click on Plugin manager (bottom left corner). 10 | 2. Search *Defender Deploy* from the Modules list, and click "Activate". 11 | 3. A new tab in the left nav bar with the OpenZeppelin icon should be displayed. 12 | 13 | image::remix-plugin-install.png[Install Defender Remix Plugin,330,500] 14 | 15 | [[usage]] 16 | == Usage 17 | 18 | 19 | [[api-key-generation]] 20 | === API Key generation 21 | In your Defender dashboard, go to *Settings -> API Keys* and click *Create API Key*, you only need _Manage Deployments_ permission. 22 | 23 | WARNING: We also recommend to set an expiration for the API Key, considering that is going to be used from an external site. 24 | 25 | image::remix-plugin-api-key.png[Defender Remix Plugin Api Key, 400, 400] 26 | 27 | [[deploying-from-remix]] 28 | === Deployment from Remix 29 | 30 | Go to Remix IDE site, and open Defender plugin (see Installation step). 31 | 32 | [[setup]] 33 | ==== Setup 34 | Set your *API Key* and *API Secret* and press "Authenticate". If the keys are valid, you should see a green tick in at the right indicating that you were succesfully authenticated, also a message in the Remix terminal. 35 | 36 | image::remix-plugin-setup.png[Defender Remix Plugin Setup] 37 | 38 | [[network]] 39 | ==== Network 40 | Select any of the supported networks. This also includes private and fork networks configured in your tenant. 41 | 42 | image::remix-plugin-network.png[Defender Remix Plugin Network] 43 | 44 | [[approval-process]] 45 | ==== Approval Process 46 | Here you have 3 options: 47 | 48 | - Select an existing approval process from your *Deployment Environment* configured for the selected network. 49 | 50 | NOTE: If you have an existing deployment environment in the selected network, this is the only option allowed. 51 | 52 | - If the *Deployment Envoronment* does not exist for the selected network, then you can create a new one. 53 | 54 | NOTE: If the Approval Process to be created is a Relayer, the API Key must include _Manage Relayers_ permission. 55 | 56 | - Additionally, you can use the *injected provider* from Remix (a browser wallet) to deploy the contract, this will create a Defender *Deployment Environment* under the hood after deploying the contract. 57 | 58 | image::remix-plugin-approval-process.png[Defender Remix Plugin Approval Process] 59 | 60 | [[deploy]] 61 | ==== Deploy 62 | You should see the latest compiled contract along with the constructor inputs. 63 | 64 | NOTE: In case you don't see it, compile the target contract again, the Defender plug-in should detect the compilation and display the contructor inputs. 65 | 66 | WARNING: Upgradable contracts are not yet fully supported. This action will only deploy the implementation contract without initializing. For safe upgrades, we strongly recommend usign https://github.com/OpenZeppelin/openzeppelin-upgrades[Upgrades Package, window=_blank]. 67 | 68 | image::remix-plugin-deploy.png[Defender Remix Plugin Deploy] 69 | 70 | 71 | [[deterministic-deployments]] 72 | ==== Deterministic Deployments 73 | 74 | Defender Deploy supports a `salt` value to create deployments to deterministic addresses using `create2`. Click on `Deterministic` checkbox and set the salt field to any arbitrary value. 75 | 76 | image::remix-plugin-deploy-deterministic.png[Defender Remix Plugin Deploy Deterministic] 77 | 78 | [[further-steps]] 79 | ==== Further Steps 80 | 81 | Once the contract deployment was submitted to Defender, in some cases you will need to complete the deployment from Defender Dashboard, you should see a green banner indicating that the contract was submitted and a link to your Deployment in Defender. 82 | 83 | image::remix-plugin-deploy-completed.png[Defender Remix Plugin Deploy Completed] 84 | 85 | [[feedback]] 86 | == Feedback 87 | 88 | The Defender Remix Plugin is open source, for feedback related to the plugin, please submit an issue in the https://github.com/OpenZeppelin/defender-deploy-plugin[Github Repository, window=_blank] or send an email to `defender-support@openzeppelin.com`. -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/sdk.adoc: -------------------------------------------------------------------------------- 1 | = Defender SDK and API 2 | 3 | https://www.npmjs.com/package/@openzeppelin/defender-sdk[Defender SDK, window=_blank] (Formerly defender-client packages) is a node package that allows developers to interact with Defender programatically using Javascript/Typescript. 4 | 5 | See https://github.com/OpenZeppelin/defender-sdk[sdk repository, window=_blank] or https://www.api-docs.defender.openzeppelin.com/[SDK and API documentation, window=_blank] for more detailed information. 6 | 7 | == Installation 8 | 9 | You can install the whole package using NPM or any of your favorite package managers 10 | 11 | ``` 12 | npm install @openzeppelin/defender-sdk 13 | ``` 14 | 15 | or you can install single subpackages 16 | 17 | ``` 18 | npm install @openzeppelin/defender-sdk-deploy-client 19 | ``` 20 | 21 | NOTE: For more information about setup, examples and usage, please visit https://github.com/OpenZeppelin/defender-sdk[Defender SDK, window=_blank] README file in Github. 22 | 23 | 24 | == API Keys 25 | 26 | In order to operate your Defender account using the SDK or API, Defender requires API keys and secrets generated in the dashboard to authenticate requests. 27 | 28 | When creating API keys, you can also specify the expiration in days, hours and minutes. 29 | 30 | image::api-key-expiration-config.png[API Key expiration configuration in Defender] 31 | 32 | Defender notifies **3 days** before and **at expiration time** about the API keys expiration. 33 | 34 | WARNING: Once the key is expired, any request sent to Defender API will throw `API Key is either expired or invalid` error. 35 | 36 | === Relayer API Keys 37 | 38 | Relayers API Keys are generated in Relayer details page, and are exclusively used for managing the signer operations for that Relayer, e.g. send or query transactions, get the nonce or sign data. 39 | 40 | ```js 41 | const creds = { 42 | relayerApiKey: , 43 | relayerApiSecret: , 44 | }; 45 | const client = new Defender(creds); 46 | 47 | const txResponse = await client.relaySigner.sendTransaction({ 48 | to: '0x179810822f56b0e79469189741a3fa5f2f9a7631', 49 | value: 1, 50 | speed: 'fast', 51 | gasLimit: '21000', 52 | }); 53 | ``` 54 | 55 | NOTE: Only `client.relaySigner` package is available when authenticating using `relayerApiKey` and `relayerApiSecret`. 56 | 57 | === Admin API Keys 58 | 59 | Admin API Keys are generated in **Manage -> API Keys**, and they are used to operate all other resources in Defender, including relayers CRUD operations. 60 | ```js 61 | const creds = { 62 | apiKey: , 63 | apiSecret: , 64 | }; 65 | const client = new Defender(creds); 66 | 67 | const proposals = await client.proposal.list({ 68 | limit: 10, 69 | next: undefined, 70 | }); 71 | ``` 72 | 73 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/settings/notifications.adoc: -------------------------------------------------------------------------------- 1 | [[notification-channels]] 2 | = Notification Channels 3 | 4 | Use Notification Channels to get notified about events across different Defender Modules, like Monitor Triggers, Workflows or Relayer Transactions lifecycle events. 5 | 6 | [[supported-channels]] 7 | == Supported Channels 8 | 9 | [[from-defender]] 10 | === From Defender 11 | - *Email*: Receive emails from the Defender trusted address: noreply@defender.openzeppelin.com 12 | - *Webhooks*: Configure your own endpoints to receive signed notifications. 13 | 14 | [[third-party-services]] 15 | === Third Party Services 16 | - https://slack.com/[*Slack*, window=_blank]. 17 | - https://telegram.org/[*Telegram*, window=_blank]. 18 | - https://discord.com/[*Discord*, window=_blank]. 19 | - https://www.datadoghq.com/[*Datadog*, window=_blank]. 20 | - https://www.pagerduty.com/[*PagerDuty*, window=_blank]. 21 | - https://www.atlassian.com/software/opsgenie[*Opsgenie*, window=_blank]. 22 | 23 | 24 | 25 | [[setup]] 26 | == Setup 27 | 28 | Go to *Settings -> Notification Channels* section and select and configure your preferred channel. 29 | 30 | ++++ 31 |
32 | Notification channel creation in Defender 33 |
34 | ++++ 35 | 36 | [[usage]] 37 | == Usage 38 | The Notification Channel can be linked to any Defender module to get notified about events. 39 | 40 | ++++ 41 |
42 | Use notification channel in Defender module 43 |
44 | ++++ 45 | 46 | Also, it is possible to customize the notification template, xref:module/monitor.adoc#customizing-notification[see how]. 47 | 48 | 49 | [[additional-configurations]] 50 | == Additional configurations 51 | 52 | [[webhooks]] 53 | === Webhook Secrets 54 | 55 | As an additional security measure, Defender implements a Hash-based Message Authentication Code (https://en.wikipedia.org/wiki/HMAC[HMAC, window=_blank]), by adding a `Defender-Signature` and `Defender-Timestamp` request headers to the notification sent to webhook endpoints. Therefore, the endpoint receiving the notification can verify the authenticity of the request. 56 | 57 | Each webhook notification has a secret key associated that can be accessed under *Settings -> Notification Channnels -> Webhook details*. 58 | 59 | The `Defender-Signature` is generated using https://en.wikipedia.org/wiki/SHA-2[SHA256 algorithm, window=_blank] and `webhook secret` to sign the payload and the timestamp. 60 | 61 | NOTE: Only Admin users in the Account have permission to see the webhook secret. 62 | 63 | 64 | [[signature-validation]] 65 | ==== Signature Validation 66 | 67 | [[using-defender-sdk]] 68 | ===== Using Defender SDK 69 | 70 | The authenticity of the signature can be validated using `verifySignature` utility function in xref:sdk.adoc[Defender SDK]. 71 | 72 | ```js 73 | function webhookHandler(req, res) { 74 | const signature = req.headers['Defender-Signature']; 75 | const timestamp = req.headers['Defender-Timestamp']; 76 | 77 | const defender = new Defender({ 78 | apiKey: process.env.API_KEY, 79 | apiSecret: process.env.API_SECRET, 80 | }); 81 | 82 | const result = client.notificationChannel.verifySignature({ 83 | body: req.body, 84 | signature, 85 | timestamp, 86 | secret: process.env.WEBHOOK_SECRET, 87 | validityInMs: 1000 * 60 * 10, // 10 mins 88 | }); 89 | 90 | if (!result.valid) throw new Error(result.error); 91 | 92 | // your handler code 93 | } 94 | ``` 95 | 96 | [[manual-verifcation]] 97 | ===== Manual Verification 98 | 99 | The signature is generated using HMAC with `SHA256` algorithm, so it can be verified in any programming language using the right `Webhook Secret`. 100 | 101 | [[python-example]] 102 | ===== Python example 103 | 104 | NOTE: This code example was tested in Python 3.12. For different versions, the code might be slightly different. 105 | 106 | ```py 107 | from datetime import datetime, timedelta, UTC 108 | import hmac 109 | import hashlib 110 | 111 | def verify_signature(body_object: dict, timestamp: str, signature: str secret: str) -> bool: 112 | # Parse the timestamp 113 | try: 114 | timestamp_dt = datetime.fromisoformat(timestamp) 115 | except ValueError: 116 | return False # Invalid timestamp format 117 | 118 | # Get the current time and calculate the time difference 119 | current_time = datetime.now(UTC) 120 | time_difference = current_time - timestamp_dt 121 | 122 | # Check if the time difference is within the allowed range (10 minutes) 123 | if time_difference > timedelta(minutes=10): 124 | return False 125 | 126 | # Merge timestamp with body_object 127 | payload_to_verify = {**body_object, 'timestamp': timestamp} 128 | payload_to_verify_str = json.dumps(payload_to_verify, separators=(',', ':')) 129 | 130 | # Create a new HMAC object using the secret and the SHA256 hash algorithm 131 | hmac_obj = hmac.new(secret.encode(), payload_to_verify_str.encode(), hashlib.sha256) 132 | 133 | # Generate signature 134 | generated_signature = hmac_obj.hexdigest() 135 | 136 | # Compare the generated signature with the provided signature 137 | return hmac.compare_digest(generated_signature, signature) 138 | ``` -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/tutorial/access-control.adoc: -------------------------------------------------------------------------------- 1 | # Modify and assign roles in a role-based access control smart contract 2 | 3 | Defender allows you to seamlessly oversee and command contract permissions on a grand scale, with the power to view and control access at a granular level. This tutorial shows how to add a smart contract to see and manage its roles, including assigning and removing roles. 4 | 5 | [[pre-requisites]] 6 | == Pre-requisites 7 | 8 | * OpenZeppelin Defender account. You can sign up to Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 9 | * Any external wallet (like Metamask) with an EOA that holds funds in Sepolia. 10 | 11 | [[add]] 12 | == 1. Add contract 13 | 14 | NOTE: For this tutorial, you will create a contract that implements the role-based Access Control library using https://sepolia.etherscan.io/address/0xF909B3dBB525fDe7C3e8cd59FbECF3D42c217454[this, window=_blank] factory deployed to Sepolia. Your created contract will automatically assign you the admin role to manage its roles. 15 | 16 | . Open the Defender https://defender.openzeppelin.com/v2/#/address-book/new[Address Book, window=_blank] in a web browser. 17 | . Fill the form with the following values and click `Create`: 18 | + 19 | * Name: `Access Control Factory` 20 | * Network: `Sepolia` 21 | * Address: `0xF909B3dBB525fDe7C3e8cd59FbECF3D42c217454` 22 | 23 | + 24 | image::tutorial-access-control-factory.png[Address Book for factory] 25 | 26 | . Navigate to https://defender.openzeppelin.com/v2/#/transaction-proposals/new?[Transaction Proposals, window=_blank]. 27 | . Fill the **General Information** section with the following values: 28 | + 29 | * Name: `Create Access Control contract` 30 | * Target contract: `Access Control Factory` 31 | 32 | + 33 | image::tutorial-access-control-tx-general.png[Transaction Proposal general information] 34 | 35 | . For the **Function** section, select the `create` function. 36 | . Open the **Approval Process** section, click the input field and select `Create Approval Process`. 37 | . Fill the approval process form with the following values and click `Save Changes`: 38 | + 39 | * Name: `Access Control Admin` 40 | * Type: `EOA` 41 | * Address: _Your wallet EOA address_ 42 | 43 | . Connect your wallet with the EOA address of the approval process created and click `Submit Transaction Proposal`. 44 | + 45 | image::tutorial-access-control-submit-proposal.gif[Transaction Proposal submit proposal] 46 | 47 | . Click on the `Create Access Control contract` transaction proposal. 48 | . Click the top-right button `Approve and Execute` and confirm the transaction on your wallet. 49 | + 50 | image::tutorial-access-control-submit-tx.gif[Transaction Proposal submit tx] 51 | . Scroll down and under **Execution Result**, hover over the first contract to copy its address. 52 | + 53 | image::tutorial-access-control-copy-address.png[Transaction Proposal copy address] 54 | . Navigate to the Defender https://defender.openzeppelin.com/v2/#/address-book/new Address Book, window=_blank] to add your newly created contract. 55 | . Fill the form with the following values and click `Create`: 56 | + 57 | * Name: `Access Control Contract` 58 | * Network: `Sepolia` 59 | * Address: _Contract address copied from the previous steps_ 60 | * ABI: _Copy and paste the following_ 61 | 62 | + 63 | [source,json] 64 | ---- 65 | [{"inputs": [],"stateMutability": "nonpayable","type": "constructor"},{"inputs": [],"name": "AccessControlBadConfirmation","type": "error"},{"inputs": [{"internalType": "address","name": "account","type": "address"},{"internalType": "bytes32","name": "neededRole","type": "bytes32"}],"name": "AccessControlUnauthorizedAccount","type": "error"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "bytes32","name": "role","type": "bytes32"},{"indexed": true,"internalType": "bytes32","name": "previousAdminRole","type": "bytes32"},{"indexed": true,"internalType": "bytes32","name": "newAdminRole","type": "bytes32"}],"name": "RoleAdminChanged","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "bytes32","name": "role","type": "bytes32"},{"indexed": true,"internalType": "address","name": "account","type": "address"},{"indexed": true,"internalType": "address","name": "sender","type": "address"}],"name": "RoleGranted","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "bytes32","name": "role","type": "bytes32"},{"indexed": true,"internalType": "address","name": "account","type": "address"},{"indexed": true,"internalType": "address","name": "sender","type": "address"}],"name": "RoleRevoked","type": "event"},{"inputs": [],"name": "DEFAULT_ADMIN_ROLE","outputs": [{"internalType": "bytes32","name": "","type": "bytes32"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "RANDOM_ROLE","outputs": [{"internalType": "bytes32","name": "","type": "bytes32"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes32","name": "role","type": "bytes32"}],"name": "getRoleAdmin","outputs": [{"internalType": "bytes32","name": "","type": "bytes32"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes32","name": "role","type": "bytes32"},{"internalType": "address","name": "account","type": "address"}],"name": "grantRole","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "bytes32","name": "role","type": "bytes32"},{"internalType": "address","name": "account","type": "address"}],"name": "hasRole","outputs": [{"internalType": "bool","name": "","type": "bool"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes32","name": "role","type": "bytes32"},{"internalType": "address","name": "callerConfirmation","type": "address"}],"name": "renounceRole","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "bytes32","name": "role","type": "bytes32"},{"internalType": "address","name": "account","type": "address"}],"name": "revokeRole","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "bytes4","name": "interfaceId","type": "bytes4"}],"name": "supportsInterface","outputs": [{"internalType": "bool","name": "","type": "bool"}],"stateMutability": "view","type": "function"}] 66 | ---- 67 | 68 | . Navigate to the https://defender.openzeppelin.com/v2/#/access-control/contracts[Access Control page, window=_blank]. 69 | . Observe your newly added contract with the number addresses that hold the admin role. 70 | + 71 | image::tutorial-access-control-page.gif[Access Control page with contract] 72 | 73 | . Click on the contract card. 74 | 75 | [[contract]] 76 | == 2. View and modify roles 77 | 78 | In your contract-specific page, you can see the addresses that hold the `DEFAULT_ADMIN_ROLE` role, which is the EOA address from the approval process you used to deploy the contract. To make a change, click on the role and input the new address (or remove one address if you want to remove it from the role). Follow these steps to add a new address to the `DEFAULT_ADMIN_ROLE`: 79 | 80 | . Click on the `DEFAULT_ADMIN_ROLE` role. 81 | . Select any address from the dropdown menu or add a new one. 82 | . Scroll down and click on `Select an Approval Process`. 83 | . Select your `Access Control Admin` approval process. 84 | . Check that your wallet is connected with the right EOA address. If not, click on the button below the field to connect your wallet. 85 | . Click on `Save Changes` and confirm the transaction on your wallet. 86 | . Wait for the transaction to get executed and check that the new address holds the `DEFAULT_ADMIN_ROLE` role. 87 | 88 | + 89 | image::tutorial-access-control-add.gif[Access Control page of contract add role] 90 | 91 | For ownable contracts, you can only make changes to the `Owner` role using an approval process that matches the current owner's address. When using a multisig as approval process, you will see the pending proposals on the right side of the page. 92 | 93 | The page sync every minute, and updates when modifying a role. 94 | 95 | [[next-steps]] 96 | == Next steps 97 | 98 | Congratulations! You can import other contracts and modify their roles. 99 | 100 | NOTE: After configuring Access Control, we recommend seting up Workflows. Learn how to use Workflows with its tutorial xref::tutorial/workflows.adoc[here]. 101 | 102 | [[references]] 103 | == References 104 | 105 | * xref::module/access-control.adoc[Access Control Documentation] 106 | * https://sepolia.etherscan.io/address/0xF909B3dBB525fDe7C3e8cd59FbECF3D42c217454[Access Control Factory, window=_blank] 107 | * https://sepolia.etherscan.io/address/0x1b073085c60ace585c4179984b3be5bf9ef53176[Access Control Contract, window=_blank] 108 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/tutorial/actions.adoc: -------------------------------------------------------------------------------- 1 | # Automate smart contract transaction for hourly activity 2 | 3 | Defender allows you to automate smart contract operational tasks with easy integration with the rest of Defender. This tutorial shows how to build an action that sends an on-chain transaction every hour that adds an object to a box and increases the number of objects inside. 4 | 5 | [[pre-requisites]] 6 | == Pre-requisites 7 | 8 | * OpenZeppelin Defender account. You can sign up to Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 9 | 10 | NOTE: Learn to xref::tutorial/deploy.adoc[deploy] and xref::tutorial/monitor.adoc[monitor] contracts through Defender! 11 | 12 | [[setup]] 13 | == 1. Set up action 14 | 15 | You will configure an action that sends an hourly transaction with the `addObject()` function to the `0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074` contract in Sepolia, which is an example of a Box contract deployed in the xref::tutorial/deploy.adoc[Deploy] tutorial. To do so, follow these steps: 16 | 17 | . Run the following command in your terminal: 18 | . Open https://defender.openzeppelin.com/v2/#/relayers[Defender Relayers, window=_blank] in a web browser. 19 | . Click on *Create Relayer* with the name `Actions Relayer` and Sepolia network. 20 | . Fund it with some Sepolia ETH. This relayer will send and pay for the automated transactions. 21 | . Open https://defender.openzeppelin.com/v2/#/actions[Defender Actions, window=_blank]. 22 | . Click on *Create Action*. 23 | . Name the action `Hourly object add`. 24 | . Select *Schedule* as trigger, and a *Timespan* of 1 hour as schedule. 25 | . Select the *Actions Relayer* as the connected relayer. 26 | . Paste the following code in the *Code* field: 27 | + 28 | [source,jsx] 29 | ---- 30 | const { Defender } = require('@openzeppelin/defender-sdk'); 31 | 32 | exports.handler = async function(credentials) { 33 | const client = new Defender(credentials); 34 | 35 | const txRes = await client.relaySigner.sendTransaction({ 36 | to: '0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074', 37 | speed: 'fast', 38 | data: '0x62029d2a', 39 | gasLimit: '80000', 40 | }); 41 | 42 | console.log(txRes); 43 | return txRes.hash; 44 | } 45 | ---- 46 | The contract address is the target, which is `0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074`, and data is `0x62029d2a`, the encoded version of the `addObject()` function of the contract. 47 | + 48 | . Click on *Save Action*. 49 | 50 | After saving, the Actions page should look like this: 51 | 52 | image::tutorial-actions-action.png[Actions action card] 53 | 54 | Your action will now be running every hour! You can check the https://defender.openzeppelin.com/v2/#/logs[Defender Logs, window=_blank] for more detailed information about the activity. 55 | 56 | [[verify]] 57 | == 2. Verify activity 58 | 59 | After the action has run for a while, you can verify that the transaction is being sent every hour. To do so, open the https://sepolia.etherscan.io/address/0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074[Etherscan contract page, window=_blank] and look for transactions from the configured Relayer. An alternative is to search your Relayer in Etherscan and look for the transactions sent to the contract. 60 | 61 | You will also receive alerts in case the action fails (for example, if the Relayer runs out of gas). They look like this: 62 | 63 | image::tutorial-actions-alert.png[Actions alert] 64 | 65 | [[next-steps]] 66 | == Next steps 67 | 68 | Congratulations! You can modify the action to automate other contracts and build more complex transactions. In case you are interested in advanced use cases, we are working on actions-related guides. 69 | 70 | NOTE: Alongisde actions, we recommend using Access Control to manage a contract's permissions through Defender. Learn how to use Access Control with its tutorial xref::tutorial/access-control.adoc[here]. 71 | 72 | [[references]] 73 | == References 74 | 75 | * xref::module/actions.adoc[Actions Documentation] 76 | * xref::module/actions.adoc#defining-code[More information on Action's Javascript code] 77 | * https://sepolia.etherscan.io/address/0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074[BoxV2 Sepolia contract, window=_blank] 78 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/tutorial/monitor.adoc: -------------------------------------------------------------------------------- 1 | # Monitor a smart contract for on-chain activity 2 | 3 | Defender allows you to monitor smart contract transactions and events across chains. This tutorial shows how to build a customized Monitor template and use it in a real-world context to monitor a https://uniswap.org/[Uniswap V2, window=_blank] pool. 4 | 5 | [[pre-requisites]] 6 | == Pre-requisites 7 | 8 | * OpenZeppelin Defender account. You can sign up to Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 9 | 10 | NOTE: Learn to deploy contracts to monitor using Defender xref::tutorial/deploy.adoc[here]! 11 | 12 | [[configure]] 13 | == 1. Configure the monitor 14 | 15 | You will monitor the `0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc` contract in the Ethereum mainnet, which is the https://etherscan.io/address/0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc[Uniswap V2 USDC-ETH pool, window=_blank]. This contract has constant activity, making it a good candidate to see how quick monitors are. To configure a monitor, follow these steps: 16 | 17 | . Open https://defender.openzeppelin.com/v2/#/monitor[Defender Monitor, window=_blank] in a web browser. 18 | . Click on *Create Monitor*. 19 | + 20 | image::tutorial-monitor-landing.png[Monitor landing page] 21 | 22 | . Name this monitor as `Uniswap V2: USDC-ETH Monitor`. 23 | . Select the `Financial` risk category. 24 | . Click the *Contracts* field and select to add a new address. 25 | . Fill the form with the following parameters and select it as contract to monitor: 26 | 27 | + 28 | * Name: `Uniswap V2: USDC-ETH Pool` 29 | * Network: `Mainnet` 30 | * Address: `0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc` 31 | 32 | . Select `1 confirmation block`. Defender will automatically pick up the ABI, so we can select the transaction filters next. 33 | 34 | + 35 | image::tutorial-monitor-first.png[Monitor added contract] 36 | 37 | . Add the `status == "success"` parameter to *Transaction Properties* to filter by transaction-level data and confirm transactions are successfully confirmed and not reverted. 38 | 39 | + 40 | image::tutorial-monitor-transaction-filters.png[Monitor transaction filters] 41 | 42 | . Select the `Swap` event from the dropdown menu. This event is emitted every time a swap is made in the pool. 43 | 44 | + 45 | image::tutorial-monitor-event-filter.png[Monitor event filter] 46 | 47 | . Skip function-level filters as you are already tracking all `Swap` events emitted from the contract. 48 | . Select a notification channel of your choice (such as email). 49 | . Click on *Save Monitor*. 50 | 51 | + 52 | image::tutorial-monitor-alerts.png[Monitor alerts] 53 | 54 | Your monitor is now running! 55 | 56 | image::tutorial-monitor-card.png[Monitor card] 57 | 58 | [[receive-alerts]] 59 | == 2. Receive alerts 60 | 61 | Alerts will start rolling in as long as the monitor is active. Your notifications should look like this if you selected email as the notification channel: 62 | 63 | image::tutorial-monitor-receive.png[Monitor Telegram alert] 64 | 65 | You can pause or delete monitors on the https://defender.openzeppelin.com/v2/#/monitor[Defender Monitor, window=_blank] page. This one will trigger frequently so you will likely want to pause it using the toggle on the right after you receive a couple of alerts. You can also save a monitor as a template by clicking on the dotted icon of its card and `Save as Template`. 66 | 67 | image::tutorial-monitor-save-template.png[Monitor save template] 68 | 69 | [[next-steps]] 70 | == Next steps 71 | 72 | Congratulations! You can modify the monitor to filter for specific `Swap` data or target another pool. In case you are interested in advanced use cases, we are working on monitor-related guides. 73 | 74 | NOTE: After setting up a monitor, we recommend creating Actions on Defender. Learn how to use Actions with its tutorial xref::tutorial/actions.adoc[here]. 75 | 76 | [[references]] 77 | == References 78 | 79 | * xref::module/actions.adoc[Actions Documentation] 80 | * xref::settings.adoc#notifications[Manage Notificacion Channels Documentation] 81 | * https://etherscan.io/address/0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc[Uniswap V2 USDC-ETH Pool, window=_blank] 82 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/tutorial/relayer.adoc: -------------------------------------------------------------------------------- 1 | # Using Relayer for Sending Transactions 2 | 3 | In this tutorial, we will explore how to use the xref:module/relayers.adoc[Relayers] to send transactions. We will cover: 4 | 5 | * Checking relayer information. 6 | * Sending a transaction. 7 | * Checking the relayer status. 8 | 9 | By the end of this tutorial, you will have a basic understanding of how to use the Relayer to interact with smart contracts. 10 | 11 | [[pre-requisites]] 12 | == Pre-requisites 13 | 14 | * OpenZeppelin Defender account. You can sign up to Defender https://defender.openzeppelin.com/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 15 | * https://nodejs.org/en[NodeJS and NPM, window=_blank] 16 | * https://www.npmjs.com/package/ts-node[Typescript for Node js, window=_blank] 17 | * Any IDE or text editor 18 | 19 | [[Set-Up-Relayer]] 20 | == 1. Set Up Relayer 21 | 22 | Let's start by creating a Relayer: 23 | 24 | * Open https://defender.openzeppelin.com/#/relayers[Defender Operate & Automate] in a web browser. 25 | + 26 | image::tutorial-relayer-step1.png[Manage Relayer] 27 | * Click on *Create Relayer* with the name ETH Sepolia Relayer and Sepolia network. 28 | + 29 | image::tutorial-relayer-step2.png[Create Relayer] 30 | * Fund it with some Sepolia ETH. This relayer will send and pay for the automated transactions. 31 | * To create an API key for a Relayer, click on the Relayer and then on the *More* button to expand the dropdown and select *Create API Key* 32 | + 33 | image::tutorial-relayer-step3.png[Create Relayer API] 34 | * Now you can set API key expiration in minutes, hours or days. 35 | + 36 | image::tutorial-relayer-step3-1.png[Save Relayer API] 37 | * Once the API Key is created, make sure to write down the secret key. The API secret is only visible once during the creation — if you don’t write it down, it’s lost forever. 38 | + 39 | image::tutorial-relayer-step4.png[Save Relayer API] 40 | 41 | [[Check-Relayer-Information]] 42 | == 2. Check Relayer Information 43 | 44 | * Let's start by checking the information of our relayer. 45 | * Add Relayer in `.env` File 46 | * Edit `.env` file in your project root directory and add your Relayer API Key and Secret: 47 | + 48 | [source,jsx] 49 | ---- 50 | RELAYER_API_KEY=your_api_key 51 | RELAYER_SECRET_KEY=your_api_secret 52 | ---- 53 | 54 | * Create a file named `storeObject.ts` in the project. 55 | * Now let’s add the following code: 56 | + 57 | [source,jsx] 58 | ---- 59 | const { Defender } = require('@openzeppelin/defender-sdk'); 60 | 61 | const dotenv = require('dotenv'); 62 | 63 | dotenv.config(); 64 | 65 | async function main() { 66 | 67 | const client = new Defender({ 68 | 69 | relayerApiKey: process.env.RELAYER_API_KEY, 70 | relayerApiSecret: process.env.RELAYER_SECRET_KEY, 71 | }); 72 | 73 | const info = await client.relaySigner.getRelayer(); 74 | console.log('Relayer Info:', JSON.stringify(info, null, 2)); 75 | 76 | } 77 | 78 | main().catch((error) => { 79 | console.error(error); 80 | process.exitCode = 1; 81 | }); 82 | 83 | ---- 84 | 85 | * Execute the script to check the relayer information: 86 | + 87 | [source,jsx] 88 | ---- 89 | ts-node storeObject.ts 90 | ---- 91 | 92 | Alternatively, if you want to use Node directly: 93 | [source,jsx] 94 | ---- 95 | node storeObject.js 96 | ---- 97 | 98 | [[Send-Transaction]] 99 | == 3. Send Transaction 100 | 101 | Next, we will send a transaction using the relayer. 102 | 103 | * Let’s edit the same file and add the following code: 104 | + 105 | [source,jsx] 106 | ---- 107 | const tx = await client.relaySigner.sendTransaction({ 108 | to: '0x1B9ec5Cc45977927fe6707f2A02F51e1415f2052', 109 | speed: 'fast', 110 | data: '0x6057361d000000000000000000000000000000000000000000000000000000000000000a', 111 | gasLimit: '80000', 112 | }); 113 | console.log('Transaction sent! Hash:', tx.hash); 114 | ---- 115 | 116 | Here we are using the Sepolia https://sepolia.etherscan.io/address/0x1B9ec5Cc45977927fe6707f2A02F51e1415f2052[Box contract] as the target, which is: 117 | [source,jsx] 118 | ---- 119 | 0x1B9ec5Cc45977927fe6707f2A02F51e1415f2052 120 | ---- 121 | 122 | and data is the encoded version of the store() function with ‘10’ as input parameter. 123 | [source,jsx] 124 | ---- 125 | 0x6057361d000000000000000000000000000000000000000000000000000000000000000a 126 | ---- 127 | 128 | * Execute the script to send a transaction: 129 | + 130 | [source,jsx] 131 | ---- 132 | ts-node storeObject.ts 133 | ---- 134 | 135 | Alternatively, if you want to use Node directly: 136 | [source,jsx] 137 | ---- 138 | node storeObject.js 139 | ---- 140 | 141 | [[Check-Transaction-Status]] 142 | == 4. Check Transaction Status 143 | 144 | Finally, let's check the status of our transaction status. 145 | 146 | * Edit the file again and add the following code: 147 | + 148 | [source,jsx] 149 | ---- 150 | const txUpdate = await client.relaySigner.getTransaction(tx.transactionId); 151 | console.log('Tx Status', JSON.stringify(txUpdate, null, 2)); 152 | ---- 153 | 154 | * Execute the script to check the relayer status: 155 | + 156 | [source,jsx] 157 | ---- 158 | ts-node storeObject.ts 159 | ---- 160 | 161 | Alternatively, if you want to use Node directly: 162 | [source,jsx] 163 | ---- 164 | node storeObject.js 165 | ---- 166 | 167 | [[Next-Steps]] 168 | == 5. Next Steps 169 | Congratulations! You have successfully used the Relayer to check information, send transactions, and verify the transaction status. By following this tutorial, you have gained a fundamental understanding of how to interact with smart contracts using the Relayer. 170 | 171 | * For more information on using Relayer, refer to the xref:/module/relayers.adoc[Relayers] documentation. 172 | * Explore the xref::tutorial/actions.adoc[Actions] to automate your smart contract operational tasks with easy integration with the rest of Defender. -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/tutorial/workflows.adoc: -------------------------------------------------------------------------------- 1 | # Create an Action Workflow to decrease the number of objects in a Box contract 2 | 3 | Defender allows you to target and activate on-chain activity using Action Workflow quickly. This tutorial shows how to create a workflow that monitors the number of objects in a Box contract and executes an action when an object is added to it. 4 | 5 | [[pre-requisites]] 6 | == Pre-requisites 7 | 8 | * OpenZeppelin Defender account. You can sign up to Defender https://defender.openzeppelin.com/v2/?utm_campaign=Defender_2.0_2023&utm_source=Docs#/auth/sign-up[here, window=_blank]. 9 | 10 | [[action]] 11 | == 1. Action setup 12 | 13 | In this tutorial, you will monitor https://sepolia.etherscan.io/address/0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074[this, window=_blank] contract in Sepolia, which stores a number of objects while allowing anyone to add or remove objects using the `addObject()` and `removeObject()` functions respectively. For every object added, your workflow will execute an action that removes an object and decreases the total by one. To set up the action, follow these steps: 14 | 15 | . Open https://defender.openzeppelin.com/v2/#/relayers/new[Defender Relayers, window=_blank] in a web browser. 16 | . Fill the form with the following parameters and click on *Create*: 17 | + 18 | * *Name*: `Relayer Sepolia` 19 | * *Network*: `Sepolia` 20 | 21 | . Transfer some Sepolia ETH to the relayer address created in the previous step. 22 | . Navigate to https://defender.openzeppelin.com/v2/#/address-book/new[Defender Address Book, window=_blank] to import the `BoxV2` contract. 23 | . Fill the form with the following parameters and click on *Create*: 24 | + 25 | * *Name*: `BoxV2` 26 | * *Network*: `Sepolia` 27 | * *Address*: `0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074` 28 | 29 | . Navigate to https://defender.openzeppelin.com/v2/#/actions/workflows/transaction-template/new?[Defender Workflows Transaction Template creation page, window=_blank]. 30 | . Fill the **General Information** section with the following parameters: 31 | + 32 | * *Name*: `Remove object` 33 | * *Contract*: `BoxV2` 34 | 35 | . Select the `removeObject` function from the dropdown menu in the **Function** section. 36 | . Expand the dropdown on the **Approval Process** section and click on `Create Approval Process`. 37 | . Fill the form with the following parameters and click on *Save Changes*: 38 | + 39 | * *Name*: `BoxV2 IR Sender` 40 | * *Relayer*: `Relayer Sepolia` (created in the first step) 41 | 42 | . Select `BoxV2 IR Sender` as the approval process and click on `Save Transaction Template` 43 | 44 | + 45 | image::tutorial-workflow-first-action.png[Workflow page with Transaction Template] 46 | 47 | [[workflow]] 48 | == 2. Workflow setup 49 | 50 | With the action configured, you now need to create the workflow. To do so, follow these steps: 51 | 52 | . Open the https://defender.openzeppelin.com/v2/#/actions/workflows/new[Defender Workflows creation page, window=_blank]. 53 | . Rename the workflow `Remove from BoxV2 if Object is Added`. 54 | . Drag the `Remove object` action to the first row. 55 | . Click on *Save*. 56 | 57 | + 58 | image::tutorial-workflow-scenario.png[BoxV2 workflow] 59 | 60 | [[monitor]] 61 | == 3. Monitor setup 62 | 63 | After creating the workflow, you need to configure a monitor that keeps track of the number of objects in the BoxV2 contract to trigger the workflow. To do so, follow these steps: 64 | 65 | . Open the https://defender.openzeppelin.com/v2/#/monitor/new/custom[Defender Monitor creation page, window=_blank]. 66 | . Fill the **General Information** section with the following parameters: 67 | + 68 | * *Name*: `BoxV2 Objects Monitor` 69 | * *Risk Category*: `Suspicious Activity` 70 | * *Contract*: `BoxV2` 71 | * *Confirmation Blocks*: `Confirmed (1 blocks)` 72 | 73 | + 74 | image::tutorial-ir-first-monitor.png[Workflow Monitor General Information] 75 | 76 | . In the **Transaction Filters** section, add `status == "success"` for the `Transaction properties` field. 77 | . In the **Function** section, select `addObject()` 78 | . Within the **Alerts** section, select the `Remove from BoxV2 if Object is Added` workflow for the `Execute a Workflow` option. 79 | 80 | + 81 | image::tutorial-ir-monitor.png[Workflow BoxV2 Objects monitor] 82 | 83 | . Click on *Save Monitor*, which will start running. 84 | 85 | [[in-action]] 86 | == 4. Seeing it in action 87 | 88 | While the monitor runs, it will detect any transaction that matches the `addObject()` function to trigger the workflow. To manually execute such a transaction, follow these steps: 89 | 90 | . Open the https://defender.openzeppelin.com/v2/#/transaction-proposals/new?[Defender Transaction Proposal creation page, window=_blank]. 91 | . Fill the form with the following parameters: 92 | + 93 | * *Name*: `BoxV2 Add Object Trigger` 94 | * *Contract*: `BoxV2` 95 | * *Function*: `addObject` 96 | * *Approval Process*: `BoxV2 IR Sender` 97 | 98 | . Click on *Submit Transaction Proposal*. 99 | 100 | + 101 | image::tutorial-ir-proposal-action.png[Transaction Proposal Trigger] 102 | 103 | . Click on the transaction proposal to open its page. 104 | . Click on the top-right button *Approve and Execute* to execute the transaction, which will trigger the workflow through the monitor. 105 | . Wait for the transaction to be executed and open the https://defender.openzeppelin.com/v2/#/actions/workflows[Defender Workflows page, window=_blank]. 106 | 107 | + 108 | image::tutorial-workflow-active-scenario.png[Active Workflow] 109 | 110 | . Click on *View Active Run* and check the details of your workflow response. 111 | . After the run is executed successfully, you can verify the response by checking the activity of the contract on https://sepolia.etherscan.io/address/0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074[Etherscan, window=_blank]. It should look like this: 112 | 113 | + 114 | image::tutorial-ir-etherscan.png[Workflow Etherscan Response] 115 | 116 | [[next-steps]] 117 | == Next steps 118 | 119 | Congratulations! You now have a complete workflow that will be running and checking every confirmed block. Workflows can be expanded with parallel actions for more technical combinations. In case you are interested in advanced use cases, we are working on Workflow-related guides. 120 | 121 | [[references]] 122 | == References 123 | 124 | * xref::module/actions.adoc#workflows[Workflow Documentation] 125 | * https://sepolia.etherscan.io/address/0xC64f7ace6127bc7B0bAb23bD1871aC81e6AEC074[BoxV2, window=_blank] 126 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/wizard-plugin.adoc: -------------------------------------------------------------------------------- 1 | [[contracts-wizard-deploy-plugin]] 2 | = Contracts Wizard Deploy Plugin 3 | 4 | When configuring contracts from https://wizard.openzeppelin.com/[Contracts Wizard, window=_blank], you can directly deploy the configured Smart Contract using your Defender account. 5 | 6 | 7 | [[usage]] 8 | == Usage 9 | 10 | [[api-key-generation]] 11 | === API Key generation 12 | In your Defender dashboard, go to *Settings -> API Keys* and click *Create API Key*, you only need _Manage Deployments_ permission. 13 | 14 | WARNING: We also recommend to set an expiration for the API Key, considering that is going to be used from an external site. 15 | 16 | image::remix-plugin-api-key.png[Defender Remix Plugin Api Key, 400, 400] 17 | 18 | [[deploying-from-wizard]] 19 | === Deployment from Contracts Wizard 20 | 21 | Go to https://wizard.openzeppelin.com/[Contracts Wizard, window=_blank] site, and after editing your contract, click on "Deploy with Defender". 22 | 23 | image::wizard-plugin-start.png[Defender Wizard Plugin Getting Started, 500, 220] 24 | 25 | [[configure]] 26 | ==== Configure 27 | Set your *API Key* and *API Secret* and press "Authenticate". You should see a message below the button indicating that the credentials are valid. 28 | 29 | image::wizard-plugin-configure.png[Defender Wizard Plugin Configure] 30 | image::wizard-plugin-configure-2.png[Defender Wizard Plugin API keys] 31 | 32 | [[network]] 33 | ==== Network 34 | Select any of the supported networks. This also includes private and forked networks configured in your tenant. 35 | 36 | image::wizard-plugin-network-2.png[Defender Wizard Plugin Network] 37 | 38 | [[approval-process]] 39 | ==== Approval Process 40 | Here you have 3 options: 41 | 42 | - Select an existing approval process from your *Deployment Environment* configured for the selected network. 43 | 44 | NOTE: If you have an existing deployment environment in the selected network, this is the only option allowed. 45 | 46 | - If the *Deployment Envoronment* does not exist for the selected network, then you can create a new one. 47 | 48 | NOTE: If the Approval Process to be created is a Relayer, the API Key must include _Manage Relayers_ permission. 49 | 50 | - Additionally, you can use the *injected provider* from Remix (a browser wallet) to deploy the contract, this will create a Defender *Deployment Environment* under the hood after deploying the contract. 51 | 52 | image::wizard-plugin-approval-process.png[Defender Wizard Plugin Approval Process] 53 | 54 | [[deploy]] 55 | ==== Deploy 56 | In this step, you should see the constructor inputs of your configured contract (if any), and the option to create a deterministic deployment. 57 | 58 | NOTE: This step is reactive, if you modify the contract you will see the new constructor arguments updated right after. 59 | 60 | WARNING: Upgradable contracts are not yet fully supported. This action will only deploy the implementation contract without initializing. For safe upgrades, we strongly recommend usign https://github.com/OpenZeppelin/openzeppelin-upgrades[Upgrades Package, window=_blank]. 61 | 62 | image::wizard-plugin-deploy.png[Defender Wizard Plugin Deploy] 63 | 64 | [[deterministic-deployments]] 65 | ==== Deterministic Deployments 66 | 67 | Defender Deploy supports a `salt` value to create deployments to deterministic addresses using `CREATE2`. Click on `Deterministic` checkbox and set the salt field to any arbitrary value. 68 | 69 | NOTE: If the approval process selected is a Multisig, the `salt` is required as Defender only support deterministic deployments when using Multisigs. 70 | 71 | image::wizard-plugin-deterministic.png[Defender Wizard Plugin Deterministic Deployments] 72 | 73 | [[further-steps]] 74 | ==== Further Steps 75 | 76 | Once the contract deployment is submitted to Defender, in some cases you may need to complete the deployment from Defender Dashboard. You will see message indicating that the contract was submitted and a button that redirects to your Deployment in Defender. 77 | 78 | image::wizard-deploy-further-steps.png[Defender Wizard Plugin Further Steps, 440, 400] 79 | 80 | [[feedback]] 81 | == Feedback 82 | 83 | The Defender Deploy Plugin is open source, for feedback related to the plugin, please submit an issue in the https://github.com/OpenZeppelin/defender-deploy-plugin[Github Repository, window=_blank] or send an email to `defender-support@openzeppelin.com`. -------------------------------------------------------------------------------- /docs/modules/ROOT/partials/network.adoc: -------------------------------------------------------------------------------- 1 | type Network = 2 | | 'mainnet' 3 | | 'sepolia' 4 | | 'holesky' 5 | | 'xdai' 6 | | 'sokol' 7 | | 'fuse' 8 | | 'bsc' 9 | | 'bsctest' 10 | | 'fantom' 11 | | 'fantomtest' 12 | | 'moonbase' 13 | | 'moonriver' 14 | | 'moonbeam' 15 | | 'matic' 16 | | 'mumbai' 17 | | 'avalanche' 18 | | 'fuji' 19 | | 'arbitrum' 20 | | 'arbitrum-nova' 21 | | 'arbitrum-sepolia' 22 | | 'optimism' 23 | | 'optimism-sepolia' 24 | | 'celo' 25 | | 'alfajores' 26 | | 'aurora' 27 | | 'auroratest' 28 | | 'hedera' 29 | | 'hederatest' 30 | | 'zksync' 31 | | 'base' 32 | | 'base-sepolia' 33 | | 'linea-sepolia' 34 | | 'linea' 35 | | 'mantle' 36 | | 'mantle-sepolia' 37 | | 'scroll' 38 | | 'scroll-sepolia' 39 | | 'meld' 40 | | 'meld-kanazawa' 41 | | 'japan' 42 | | 'japan-testnet' 43 | | 'unichain' 44 | | 'unichain-sepolia' 45 | | 'geist-mainnet' 46 | | 'geist-polter' 47 | | 'abstract' 48 | | 'abstract-sepolia'; 49 | | 'peaq' 50 | | 'peaq-agung'; 51 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "npm run docs" 3 | publish = "build/site" 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "defender-docs", 3 | "version": "0.0.0", 4 | "description": "OpenZeppelin Defender documentation", 5 | "private": true, 6 | "scripts": { 7 | "docs": "oz-docs", 8 | "docs:watch": "oz-docs watch" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/OpenZeppelin/defender-docs.git" 13 | }, 14 | "keywords": [ 15 | "defender", 16 | "openzeppelin", 17 | "ethereum", 18 | "smart", 19 | "contracts", 20 | "security" 21 | ], 22 | "author": "OpenZeppelin ", 23 | "bugs": { 24 | "url": "https://github.com/OpenZeppelin/defender-docs/issues" 25 | }, 26 | "homepage": "https://openzeppelin.com/defender/", 27 | "devDependencies": { 28 | "@openzeppelin/docs-utils": "^0.1.3" 29 | } 30 | } 31 | --------------------------------------------------------------------------------