Package | Coverage |
---|---|
@synthetixio/core-utils | |
@synthetixio/core-contracts | |
@synthetixio/core-modules | |
@synthetixio/main |
Please refer to the Official Documentation for high level concepts of the Synthetix v3 protocol, as well as auto generated docs from natspec.
This is a monorepo with the following folder structure and packages:
.
├── markets // Standalone projects that extend the core Synthetix protocol with markets.
│ ├── legacy-market // Market that connects Synthetix's v2 and v3 versions.
│ └── perps-market // Market extension for perps.
│ └── spot-market // Market extension for spot synths.
│ └── bfp-market // Market extension for eth l1 perp.
│
├── protocol // Core Synthetix protocol projects.
│ ├── governance // Governance contracts for on chain voting.
│ ├── oracle-manager // Composable oracle and price provider for the core protocol.
│ └── synthetix // Core protocol (to be extended by markets).
│
└── utils // Utilities, plugins, tooling.
├── common-config // Common npm and hardhat configuration for multiple packages in the monorepo.
├── core-contracts // Standard contract implementations like ERC20, adapted for custom router storage.
├── core-modules // Modules intended to be reused between multiple router based projects.
├── core-utils // Simple Javascript/Typescript utilities that are used in other packages (e.g. test utils, etc).
├── deps // Dependency handling (e.g. mismatched, circular etc.)
├── docgen // Auto-generate docs from natspec etc.
├── hardhat-storage // Hardhat plugin used to detect storage collisions between proxy implementations.
└── sample-project // Sample project based on router proxy and cannon.
All projects in this monorepo that involve contracts use a proxy architecture developed by Synthetix referred to as the "Router Proxy". It is basically a way to merge several contracts, which we call "modules", into a single implementation contract which is the router itself. This router is used as the implementation of the main proxy of the system.
See the Router README for more details.
⚠️ When using the Router as an implementation of a UUPS Universal Upgradeable Proxy Standard be aware that any of the public functions defined in the Proxy could clash and override any of the Router modules functions. A malicious proxy owner could use this type of obfuscation to have users run code which they do not want to run. You can imagine scenarios where the function names do not look similar but share a function selector. ⚠️
If you intend to develop in this repository, please read the following items.
In the contracts, use import "hardhat/console.sol";
, then run DEBUG=cannon:cli:rpc yarn test
.
Deployment of the protocol is managed in the synthetix-deployments repository.
To prepare for system upgrades, this repository is used to release new versions of the protocol and markets.
yarn upgrade-interactive
and make sure that @usecannon/cli
and hardhat-cannon
are updated to the latest versions.yarn cannon:setup
to configure a reliable IPFS URL for publishing packages and any other preferred settings.npm whoami
returns an npm account with publishing permissions for the @synthetixio
organization, confirm an @synthetixio
npm publishing key is set as $NPM_TOKEN
in the .env
file or prepend NPM_TOKEN=_
to the command used for publishing below.git diff --exit-code .
yarn publish:dev
for the pre-release (no git tag, version looks like 1.2.3-<GIT_SHA>.0
)CANNON_PRIVATE_KEY=<PRIVATE_KEY>
to the following command.yarn deploy
"workspaces:*"
.Each step is necessary, do not skip any steps.
Verify what has changed since the last release
yarn changed
Confirm you are on the main
branch and that there are no git changes git diff --exit-code .
and you have write access to main
branch
git fetch --all
git checkout main
git pull
git diff --exit-code .
Publish the release with yarn publish:release
. (After successful publish, there should be no diff in git.)
If you aren't using an EIP-1193 compatible wallet, prepend CANNON_PRIVATE_KEY=<PRIVATE_KEY>
to the following command.
In the directory for each package you’d like to publish to cannon, run yarn deploy