SIP-109: Add Synth Exchange Suspension Support
Author | |
---|---|
Status | Implemented |
Type | Governance |
Implementor | TBD |
Release | TBD |
Discussions-To | https://research.synthetix.io/t/tbc |
Created | 2021-02-02 |
Simple Summary
Add support for the restriction of specific synth exchanges during market closures without impacting their transfer.
Abstract
The current SystemStatus
contract (introduced in SIP-44) should be amended to support a new type of suspension - synth exchanges. These must be less restrictive than the synth suspensions that currently exist and only prevent exchanging to and from the specified synth, but still allow their transfer.
Motivation
The SystemStatus
contract supports the synthSuspension(bytes32)
method allowing the protocolDAO to suspend a synth, thereby preventing its exchange, settlement or transfer. This has been used as a fairly blunt instrument to implement daily market closures of the equity synths sFTSE
and sNIKKEI
. However, given the need to support forex and commodity market closures as well over the weekend, and the fact that some of these synths, including sEUR
are part of distributed pools such as the Curve sEUR pool, prohibiting transfers is too restrictive. Thus a new mechanism to merely prevent the exchange of these synths during market closures is required.
Specification
Overview
Add a new suspension type: SynthExchange
to SystemStatus
, and support the suspension and resumption of these, along with the current Synth
suspension, in groups, thereby reducing the number of transactions required to suspend a class of synths simulatenously (say all forex or commodity synths).
Rationale
The SystemStatus
contract is where all suspension is currently managed and is already integrated with exchanging, using it to create another check is the most logical and non-intrusive spot.
Technical Specification
Add the following functions to SystemStatus
:
bytes32 public constant SECTION_SYNTH_EXCHANGE = "SynthExchange";
function suspendSynthExchange(bytes32 currencyKey, uint256 reason) external;
function resumeSynthExchange(bytes32 currencyKey) external;
event SynthExchangeSuspended(bytes32 currencyKey, uint256 reason);
event SynthExchangeResumed(bytes32 currencyKey, uint256 reason);
In addition, add the following helper functions to prevent the number of individual transactions required when working with a collection of synths:
function suspendSynthsExchange(bytes32[] calldata currencyKey, uint256 reason) external;
function resumeSynthsExchange(bytes32[] calldata currencyKey) external;
// helper function for existing suspendSynth() function
function suspendSynths(bytes32[] calldata currencyKeys, uint256 reason) external;
// helper function for existing resumeSynth() function
function resumeSynths(bytes32[] calldata currencyKeys) external;
During exchanges, on top of the existing checks, if either synth is suspended for exchanging, then the exchange will revert.
Test Cases
- Given a user has some synth A and wants to exchange into synth B
- Given the protocolDAO has suspended the exchanging of synth B
- When the user attempts to exchange A into B
- ❌ Then the transaction reverts due to synth suspension
- When the user attempts transfer their synth B
- ✅ Then it succeeds as transfers are not impacted by synth exchange suspension
- When the user attempts to settle their exchanges into synth B
- ✅ Then it succeeds as settlement is not impacted by synth exchange suspension
- When the user attempts to exchange A into B
- Given the protocolDAO has suspended the exchanging of synth A
- When the user attempts to exchange A into B
- ❌ Then the transaction reverts due to synth suspension
- When the user attempts to exchange A into B
- Given the protocolDAO has suspended the exchanging of synth B
Configurable Values (Via SCCP)
N/A
Copyright
Copyright and related rights waived via CC0.