From 63629871561dc259faeb86e850347ef01a470c6e Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Thu, 21 Sep 2023 09:34:27 +0000 Subject: [PATCH 01/16] First draft of introduction to starkex document --- .../src/content/tutorials/introduction.md | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 packages/backend/src/content/tutorials/introduction.md diff --git a/packages/backend/src/content/tutorials/introduction.md b/packages/backend/src/content/tutorials/introduction.md new file mode 100644 index 000000000..85868b897 --- /dev/null +++ b/packages/backend/src/content/tutorials/introduction.md @@ -0,0 +1,117 @@ +# Introduction to StarkEx Explorer + +StarkEx is an advanced layer-2 solution on top of Ethereum, offering users an +unprecedented combination of security, transparency, and control over their +funds. In this guide, we'll explore how the StarkEx Explorer can assist users in +ensuring their funds are safe and trades are valid. + +## 1. Data Origin and Reliability in StarkEx Explorer + +### Ethereum-based Data + +StarkEx Explorer's cornerstone is its direct reliance on the Ethereum +blockchain. Every user balance and state update on the Explorer reflects data +confirmed and recorded by Ethereum. + +### Data Delay and Implications + +Due to the nature of Ethereum's periodic commits, data on the Explorer might +have a few hours delay. While this may not always mirror real-time activities on +StarkEx, it represents a dependable and immutable state from Ethereum. + +### Why Ethereum-based Data Matters + +The exclusive sourcing from Ethereum ensures data permanency. Thus, users can +have full confidence that the amount displayed on the Explorer is what they can +withdraw, regardless of potential StarkEx issues. + +--- + +## 2. Navigating Forced Actions + +### The Purpose Behind Forced Actions + +StarkEx Exchange is designed to function smoothly under normal conditions. +However, unique situations, like user censorship by operators or unforeseen +platform hiccups, may require intervention. Forced actions come into play during +these rare circumstances, providing an emergency exit route to ensure user funds +remain secure and accessible. + +### Forced Withdrawals: Step-by-Step + +#### Why Forced Withdrawals? + +At times, regular withdrawals might be delayed or obstructed. Whether due to +potential hitches in StarkEx's operation or a user finding themselves unable to +utilize the official interface, a forced withdrawal serves as a fallback +mechanism, assuring uninterrupted access to one's assets. + +1. **Initiating the Withdrawal:** + _Screenshot: User dashboard highlighting the 'forced withdrawal' button._ + +2. **Determining the Amount:** + _Screenshot: Input box for entering the withdrawal amount._ + +3. **Ethereum Interaction:** + _Screenshot: Ethereum transaction confirmation box._ + +4. **Awaiting Operator Action:** + _Screenshot: User dashboard showing a pending forced withdrawal._ + +5. **Final Step - Retrieving Funds:** + _Screenshot: Withdrawal area with a 'Claim Funds' button._ + +### Forced Trades: A Comprehensive Guide + +#### Why Forced Trades? + +Imagine wanting to withdraw all collateral from the exchange, but having open +positions. These positions need closing first. If, for any reason (like being +censored from the official UI), you can't use standard trade options, forced +trades come to the rescue. This feature lets you close positions by finding a +willing counterparty, even if you can't interact directly with StarkEx's primary +interface. + +1. **Choosing the Trade Option:** + _Screenshot: Open position options highlighting 'Sell/Buy' choices._ + +2. **Listing on the Database:** + _Screenshot: Explorer homepage showcasing 'Open Offers' section._ + +3. **Counterparty Interaction:** + _Screenshot: Trade offer acceptance confirmation._ + +4. **Finalizing the Trade:** + _Screenshot: User dashboard with 'Finalize Trade' prompt._ + +--- + +## 3. Delving into The Escape Hatch Mechanism + +### Understanding the Need for an Escape Hatch + +Exchanges, no matter how robust, can face unforeseen challenges. Operators might +become unresponsive, or perhaps a technical glitch temporarily halts activities. +In extreme cases, if StarkEx doesn't process a forced action within the expected +period, the entire system's integrity could be in jeopardy. The Escape Hatch is +a safeguard for these extraordinary situations. It's a drastic measure, ensuring +users can always retrieve their assets. + +### Exchange Freezing + +#### Why Freeze the Exchange? + +If operators neglect their duties or don't honor forced actions, users deserve a +way to protect their interests. Freezing is a punitive action against the +operator's unresponsiveness. It's a significant step that prevents any further +regular activity on StarkEx, switching it to a "safe mode" where only emergency +actions can take place. + +1. **Kickstarting the Escape:** + _Screenshot: 'Escape' button highlighted on the dashboard._ + +2. **Moving Forward - Finalization:** + _Screenshot: Dashboard prompt showcasing 'Finalize Escape' option._ + +3. **Concluding the Escape:** + _Screenshot: Withdrawal zone with 'Conclude Escape' option._ From 7c4a9724885220533492aad3299af0ff7810d411 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Thu, 2 Nov 2023 10:16:42 +0000 Subject: [PATCH 02/16] Add introduction thumbnail --- .../frontend/src/static/images/introduction.jpg | Bin 0 -> 19340 bytes .../pages/home/components/HomeTutorials.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/frontend/src/static/images/introduction.jpg diff --git a/packages/frontend/src/static/images/introduction.jpg b/packages/frontend/src/static/images/introduction.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7929b4b05099bcd9aafd11a7930c439de8198c52 GIT binary patch literal 19340 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx b/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx index 90a1fe176..6578c0d6e 100644 --- a/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx +++ b/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx @@ -40,7 +40,7 @@ export function HomeTutorials(props: HomeTutorialsProps) {

From c24699a4b71173f542a8a5c6ce317996f8537ba7 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Sun, 5 Nov 2023 20:12:21 +0000 Subject: [PATCH 03/16] WIP on new introduction. --- .../src/content/tutorials/introduction2.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 packages/backend/src/content/tutorials/introduction2.md diff --git a/packages/backend/src/content/tutorials/introduction2.md b/packages/backend/src/content/tutorials/introduction2.md new file mode 100644 index 000000000..fe85dcf78 --- /dev/null +++ b/packages/backend/src/content/tutorials/introduction2.md @@ -0,0 +1,40 @@ +# Introduction to StarkEx Explorer + +StarkEx Explorer is an open-source tool with Web interface which allows users to independently download, verify and browse data published to Ethereum by StarkEx systems. Additionally, it provides interface to perform so called "Forced Actions" and trigger "Escape hatch" functionalities, which are the main guarantees of self-custody of funds. + +## What is StarkEx + +StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading game applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx works in a "rollup mode", changes to user's balances are also published to Ethereum. In a "validium" mode, that data is published to a set of trusted operators, called Data Availability Committee (DAC). Even though L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero Knowledge proofs) which are published to Ethereum. This architecture allows users to independently and trustlessly withdraw their funds and tokens to Ethereum via one of 2 mechanisms: + +* Forced Actions - operations which must be included by StarkEx operators in a limited amount of time +* Escape Hatch - direct interaction with Ethereum contracts if Forced Actions are not honored by StarkEx operators + +This guide will explore how the StarkEx Explorer can be used to browse data published by StarkEx systems. + +To learn how it helps users in ensuring that their funds are safe and trades are valid see: + +* Accessing personal account data on StarkEx Explorer + +To learn how to perform Forced Actions and trigger Escape Hatch operations, see the following guides: + +* Performing Forced Actions +* Triggering Escape Hatch + +## Understanding data available on StarkEx Explorer + +An important feature of StarkEx system is that users are identified by their StarkKey, not their Ethereum address, even though they are related. Specifically, forced actions and escape hatch requires user's StarkKey to be explicitly mapped on Ethereum to their StarkKey. This can happen automatically or via user action at any time, depending on the decision made by StarkEx operator. + +# State Updates + +Off-chain (L2) operations performed on StarkEx system update the system state (which includes users' balances). For example, when a user performs a trade with another user, their balances change accordingly. After some time (typically a few hours, but that depends on StarkEx Operator) a "State Update" is published to Ethereum (and DAC in validium mode). It includes *changes* that were made to user's balances since the last published state update. + +Users can browse all published state updates in the "State Updates" table. Clicking on any given state update displays its details, which includes Balance Changes for each StarkEKy. It's important to remember that they are not real transactions, but a total change that happened since previous state update. Specifically, user could have performed multiple operations in the time between two state updates, but only the final difference between the two will be presented in the Balance Changes table. + +# User Page + +Clicking on a specific Balance Change entry or searching for existing StarkKe or previously mapped Ethereum address presents "User Page", which displays: + +* Assets - balances of user's assets **during last state update**. This means that the most recent updates to balance will not be reflected until the next state update. On the other hand, balance displayed on the Explorer is "proved" on Ethereum, which means that in case of triggering Escape Hatch functionality, that balance will be used to return funds to the user. +* Balance Changes - updates to users' balances in past state updates. It's important to remember that these are not single operations performed by the user, but their cumulative effect performed between subsequent state updates. + +Forced Transactions and Offers are described in a separate guide. Transactions (L2) are an optional panel which is available via custom integration with StarkEx operator but validity of that data can't be verified. \ No newline at end of file From ae35e549053e4eb76a8721b3030ac8de89ee462a Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Sun, 5 Nov 2023 20:50:37 +0000 Subject: [PATCH 04/16] Add User Page guide. --- .../backend/src/content/tutorials/userpage.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 packages/backend/src/content/tutorials/userpage.md diff --git a/packages/backend/src/content/tutorials/userpage.md b/packages/backend/src/content/tutorials/userpage.md new file mode 100644 index 000000000..3b80beb1f --- /dev/null +++ b/packages/backend/src/content/tutorials/userpage.md @@ -0,0 +1,17 @@ +# Accessing User Page + +For introduction to StarkEx explorer, see this guide: + +* Introduction + +Accessing user page is possible in multiple ways. + +* If user knows the StarkKey, they can simply search for it using the search box. +* If user knows the Ethereum address, they can also search for it, but only if that address was previously **registered as an owner of a StarkKey**. On some exchanges this process happens automatically, but due to its high cost it is currently discouraged. +* Connecting via Metamask to calculate their StarkKey using their Ethereum account + +# Connecting via Metamask + +When user clicks on the "Connect wallet" button and approves the connection in Metamask wallet, the Explorer checks if user's Ethereum address is already "registered", i.e. mapped to a StarkKey. If it's not, user will be presented with an option to "Recover StarkKey". This operation is free of cost. By clicking on the "Recover" button, user will be presented with a "Signature request" by the Metamask interface. It is important to read the message that is supposed to be signed - it should be a sign-on request to an exchange. By "clicking" on the "Sign" button, user's StarkKey will be calculated based on their Ethereum account (using private key signature) and user will be redirected to their User Page. + + From 24bb07dd01b59fc6279be50773bf5cdd7edeaa61 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Sun, 5 Nov 2023 20:51:01 +0000 Subject: [PATCH 05/16] Update introduction. --- .../backend/src/content/tutorials/introduction2.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/content/tutorials/introduction2.md b/packages/backend/src/content/tutorials/introduction2.md index fe85dcf78..4bd281598 100644 --- a/packages/backend/src/content/tutorials/introduction2.md +++ b/packages/backend/src/content/tutorials/introduction2.md @@ -4,7 +4,7 @@ StarkEx Explorer is an open-source tool with Web interface which allows users to ## What is StarkEx -StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading game applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx works in a "rollup mode", changes to user's balances are also published to Ethereum. In a "validium" mode, that data is published to a set of trusted operators, called Data Availability Committee (DAC). Even though L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero Knowledge proofs) which are published to Ethereum. This architecture allows users to independently and trustlessly withdraw their funds and tokens to Ethereum via one of 2 mechanisms: +StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading game applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx works in a "rollup mode", changes to user's balances are also published to Ethereum. In a "validium" mode, that data is published to a set of trusted operators, called Data Availability Committee (DAC). Even though L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero Knowledge proofs) which are published to Ethereum. This architecture allows users, in case of emergency (censorship or exchange shutdown) to independently and trustlessly withdraw their funds and tokens to Ethereum via one of 2 mechanisms: * Forced Actions - operations which must be included by StarkEx operators in a limited amount of time * Escape Hatch - direct interaction with Ethereum contracts if Forced Actions are not honored by StarkEx operators @@ -22,19 +22,19 @@ To learn how to perform Forced Actions and trigger Escape Hatch operations, see ## Understanding data available on StarkEx Explorer -An important feature of StarkEx system is that users are identified by their StarkKey, not their Ethereum address, even though they are related. Specifically, forced actions and escape hatch requires user's StarkKey to be explicitly mapped on Ethereum to their StarkKey. This can happen automatically or via user action at any time, depending on the decision made by StarkEx operator. +An important feature of StarkEx system is that users are identified by their StarkKey, not their Ethereum address, even though they are related. Specifically, forced actions and escape hatch requires user's StarkKey to be explicitly mapped to their Ethereum address. This can happen automatically or via user action at any time, depending on the decision made by StarkEx operator. -# State Updates +### State Updates Off-chain (L2) operations performed on StarkEx system update the system state (which includes users' balances). For example, when a user performs a trade with another user, their balances change accordingly. After some time (typically a few hours, but that depends on StarkEx Operator) a "State Update" is published to Ethereum (and DAC in validium mode). It includes *changes* that were made to user's balances since the last published state update. Users can browse all published state updates in the "State Updates" table. Clicking on any given state update displays its details, which includes Balance Changes for each StarkEKy. It's important to remember that they are not real transactions, but a total change that happened since previous state update. Specifically, user could have performed multiple operations in the time between two state updates, but only the final difference between the two will be presented in the Balance Changes table. -# User Page +### User Page -Clicking on a specific Balance Change entry or searching for existing StarkKe or previously mapped Ethereum address presents "User Page", which displays: +Clicking on a specific Balance Change entry or searching for existing StarkKey or previously mapped Ethereum address presents "User Page", which displays: * Assets - balances of user's assets **during last state update**. This means that the most recent updates to balance will not be reflected until the next state update. On the other hand, balance displayed on the Explorer is "proved" on Ethereum, which means that in case of triggering Escape Hatch functionality, that balance will be used to return funds to the user. * Balance Changes - updates to users' balances in past state updates. It's important to remember that these are not single operations performed by the user, but their cumulative effect performed between subsequent state updates. -Forced Transactions and Offers are described in a separate guide. Transactions (L2) are an optional panel which is available via custom integration with StarkEx operator but validity of that data can't be verified. \ No newline at end of file +Forced Transactions and Offers are described in a separate guide. Transactions (L2) are an optional panel which is available via custom integration with StarkEx operator, but validity of that data can't be verified. \ No newline at end of file From dd0827c45d3c7b76f4230ab05f7d21f049664e2b Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Sun, 5 Nov 2023 21:15:16 +0000 Subject: [PATCH 06/16] Add forced actions guide --- .../src/content/tutorials/forcedactions.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 packages/backend/src/content/tutorials/forcedactions.md diff --git a/packages/backend/src/content/tutorials/forcedactions.md b/packages/backend/src/content/tutorials/forcedactions.md new file mode 100644 index 000000000..c03a177fb --- /dev/null +++ b/packages/backend/src/content/tutorials/forcedactions.md @@ -0,0 +1,63 @@ +# Forced Actions + +For introduction to StarkEx explorer, see this guide: + +* Introduction + +Forced Actions are special operations initiated via Ethereum blockchain. They are special emergency measures that should not be used under normal conditions due to their high cost and slow time of execution. They are useful when: + +* the StarkEx system (e.g. exchange) is operating normally, +* but user is not able to access system's native interface (e.g. Exchange's website) for example due to censorship + +In such scenario, forced actions provide an emergency exit route to withdraw user's assets to Ethereum. + +If the StarkEx system is not operating normally (e.g. operator's servers have been shut down completely), user will need to use an Escape Hatch, which is an expensive, last resort solution. + +### Forced Withdrawal + +Forced Withdrawals can be used to withdraw user assets, except for "perpetuals". If there are any perpetual positions open, they should be closed via "Forced Trade" before a Forced Withdrawal is attempted. + +To initiate a Forced Withdrawal, user should: + +1. Open their User Page + +1. Click on the "Withdraw" button next to their token (collateral) entry in "Assets" table. + +1. Optional: if user's Ethereum address has not been registered on Ethereum (which means that Ethereum contracts don't know which StarkKey belongs to that Ethereum address), they will be asked to do it via an Ethereum transaction. + +1. Enter requested amount to withdraw. StarkEx in a Spot trading mode will only allow to withdraw the full balance. + +1. Click on "Prepare for withdrawal" button and send the requested transaction to Ethereum. + +Created Forced Withdrawal request will be visible on User Page in "Forced transactions" panel. + +After initiating Forced Withdrawal, StarkEx operators have a predefined amount of time (usually 7 or 14 days) to perform requested withdrawal. When they do, User Page will display a "Withdrawable assets" section with a "Withdraw now" button to trigger the final transfer of funds to user's Ethereum account. + +If StarkEx Operator doesn't honor user's Forced Withdrawal request if given time, user will be able to trigger Exchange Freeze and trigger Escape Hatch functionality, described in a separate guide. + +It's important to notice that nothing stops users from manually triggering Forced Withdrawals with incorrect amounts. Such requests will still be processed by StarkEx system, but due to their invalid data they will not trigger the final withdrawal. + +### Forced Trades + +Forced Trades are special actions required to close open perpetual positions. + +To initiate a Forced Trade, user should: + +1. Open their User Page + +1. Click on the "Close" button next to their perpetual asset entry in "Assets" table. If user's position is "long", it would trigger a "Sell" trade, or "Buy" in case of a "short" position. + +1. Optional: if user's Ethereum address has not been registered on Ethereum (which means that Ethereum contracts don't know which StarkKey belongs to that Ethereum address), they will be asked to do it via an Ethereum transaction. + +1. Enter desired trade data (perpetual amount and price) + +1. Click on "Create buy/sell offer" button, which will require a user to sign with their Metamask wallet. + + +Such trade will be visible on the StarkEx Explorer Home Page and on user's User Page in the "Offers" panel. + +Offers are internal to StarkEx explorer and are not visible neither on Ethereum nor on the StarkEx system. + +Offer needs to be accepted by a counterpart via interaction with the offer on the Explorer. When some user "Accepts" the offer, original creator can either cancel or approve it by sending a Forced Withdrawal transaction to Ethereum. + +Just like the Forced Withdrawal process, StarkEx Operator has limited time to honor this trade. If they do, the position will disappear from user's User Page and collateral asset balance will be updated accordingly. Otherwise, user will be able to use Escape Hatch Functionality. \ No newline at end of file From 0c83195ac586ce40d766465739b0e19bfb42ac64 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Sun, 5 Nov 2023 21:47:49 +0000 Subject: [PATCH 07/16] Add escape hatch guide --- .../src/content/tutorials/escapehatch.md | 21 ++++ .../src/content/tutorials/introduction.md | 119 ++++-------------- .../src/content/tutorials/introduction2.md | 40 ------ 3 files changed, 42 insertions(+), 138 deletions(-) create mode 100644 packages/backend/src/content/tutorials/escapehatch.md delete mode 100644 packages/backend/src/content/tutorials/introduction2.md diff --git a/packages/backend/src/content/tutorials/escapehatch.md b/packages/backend/src/content/tutorials/escapehatch.md new file mode 100644 index 000000000..483aae331 --- /dev/null +++ b/packages/backend/src/content/tutorials/escapehatch.md @@ -0,0 +1,21 @@ +# Escape Hatch functionality + +For introduction to StarkEx explorer, see this guide: + +* Introduction + +Escape Hatch is a functionality available as the last resort for a user to withdraw their funds from StarkEx system to Ethereum. + +When the StarkEx system is operating normally but user is unable to use regular interface (e.g. Exchange's web page), they should trigger a Forced Action request, described in a separate guide, to attempt withdrawal of their funds. When such Forced Action is not honored in a predefined amount of time (configured by StarkEx, usually 7 or 14 days), either due to inaction or because the operator is not functioning at all, StarkEx Explorer will detect this state and show an option in the website header to "Request Freeze" of the exchange. + +## Exchange Freeze + +Freezing the exchange can be performed by any user if at least one Forced Action hasn't been honored by StarkEx Operator in predefined time. By clicking on the "Requste Freeze" button and approving Metamask transaction, the whole StarkEx system will enter a frozen state, in which no off-chain (L2) operations can be performed (e.g. no trades) and the only option available to the users will be to request withdrawal of their full balances. + +StarkEx Explorer's interface will change accordingly, the webpage header will display appropriate message on each page, and operations available to users will also change accordingly. + +## Performing Escape + +After user visits their User Page, there will be an "Escape" button available next to their non-perpetual tokens in the Assets panel (perpatual positions' values are automatically included in the collateral escape). After clicking on the button, if user's Ethereum address has not been registered on Ethereum (which means that Ethereum contracts don't know which StarkKey belongs to that Ethereum address), they will be asked to do it via an Ethereum transaction. Next, user will be presented with description of the escape process and asked to click on the "Initiate Escape" button. This will trigger a Metamask transaction, which can be very costly due to the amount of data, specifically a Merkle Proof which proves to the Ethereum smart contract that user is indeed the owner of given amount of assets as of the last state update. + +Once the transaction is mined on Ethereum, User Page will display a panel with "Pending escapes" section. Clicking on "Finalize Escape" button next to an asset will trigger user to send a transaction via Metamask which will perform the transfer of funds to user's Ethereum wallet. \ No newline at end of file diff --git a/packages/backend/src/content/tutorials/introduction.md b/packages/backend/src/content/tutorials/introduction.md index 85868b897..4bd281598 100644 --- a/packages/backend/src/content/tutorials/introduction.md +++ b/packages/backend/src/content/tutorials/introduction.md @@ -1,117 +1,40 @@ # Introduction to StarkEx Explorer -StarkEx is an advanced layer-2 solution on top of Ethereum, offering users an -unprecedented combination of security, transparency, and control over their -funds. In this guide, we'll explore how the StarkEx Explorer can assist users in -ensuring their funds are safe and trades are valid. +StarkEx Explorer is an open-source tool with Web interface which allows users to independently download, verify and browse data published to Ethereum by StarkEx systems. Additionally, it provides interface to perform so called "Forced Actions" and trigger "Escape hatch" functionalities, which are the main guarantees of self-custody of funds. -## 1. Data Origin and Reliability in StarkEx Explorer +## What is StarkEx -### Ethereum-based Data +StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading game applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx works in a "rollup mode", changes to user's balances are also published to Ethereum. In a "validium" mode, that data is published to a set of trusted operators, called Data Availability Committee (DAC). Even though L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero Knowledge proofs) which are published to Ethereum. This architecture allows users, in case of emergency (censorship or exchange shutdown) to independently and trustlessly withdraw their funds and tokens to Ethereum via one of 2 mechanisms: -StarkEx Explorer's cornerstone is its direct reliance on the Ethereum -blockchain. Every user balance and state update on the Explorer reflects data -confirmed and recorded by Ethereum. +* Forced Actions - operations which must be included by StarkEx operators in a limited amount of time +* Escape Hatch - direct interaction with Ethereum contracts if Forced Actions are not honored by StarkEx operators -### Data Delay and Implications +This guide will explore how the StarkEx Explorer can be used to browse data published by StarkEx systems. -Due to the nature of Ethereum's periodic commits, data on the Explorer might -have a few hours delay. While this may not always mirror real-time activities on -StarkEx, it represents a dependable and immutable state from Ethereum. +To learn how it helps users in ensuring that their funds are safe and trades are valid see: -### Why Ethereum-based Data Matters +* Accessing personal account data on StarkEx Explorer -The exclusive sourcing from Ethereum ensures data permanency. Thus, users can -have full confidence that the amount displayed on the Explorer is what they can -withdraw, regardless of potential StarkEx issues. +To learn how to perform Forced Actions and trigger Escape Hatch operations, see the following guides: ---- +* Performing Forced Actions +* Triggering Escape Hatch -## 2. Navigating Forced Actions +## Understanding data available on StarkEx Explorer -### The Purpose Behind Forced Actions +An important feature of StarkEx system is that users are identified by their StarkKey, not their Ethereum address, even though they are related. Specifically, forced actions and escape hatch requires user's StarkKey to be explicitly mapped to their Ethereum address. This can happen automatically or via user action at any time, depending on the decision made by StarkEx operator. -StarkEx Exchange is designed to function smoothly under normal conditions. -However, unique situations, like user censorship by operators or unforeseen -platform hiccups, may require intervention. Forced actions come into play during -these rare circumstances, providing an emergency exit route to ensure user funds -remain secure and accessible. +### State Updates -### Forced Withdrawals: Step-by-Step +Off-chain (L2) operations performed on StarkEx system update the system state (which includes users' balances). For example, when a user performs a trade with another user, their balances change accordingly. After some time (typically a few hours, but that depends on StarkEx Operator) a "State Update" is published to Ethereum (and DAC in validium mode). It includes *changes* that were made to user's balances since the last published state update. -#### Why Forced Withdrawals? +Users can browse all published state updates in the "State Updates" table. Clicking on any given state update displays its details, which includes Balance Changes for each StarkEKy. It's important to remember that they are not real transactions, but a total change that happened since previous state update. Specifically, user could have performed multiple operations in the time between two state updates, but only the final difference between the two will be presented in the Balance Changes table. -At times, regular withdrawals might be delayed or obstructed. Whether due to -potential hitches in StarkEx's operation or a user finding themselves unable to -utilize the official interface, a forced withdrawal serves as a fallback -mechanism, assuring uninterrupted access to one's assets. +### User Page -1. **Initiating the Withdrawal:** - _Screenshot: User dashboard highlighting the 'forced withdrawal' button._ +Clicking on a specific Balance Change entry or searching for existing StarkKey or previously mapped Ethereum address presents "User Page", which displays: -2. **Determining the Amount:** - _Screenshot: Input box for entering the withdrawal amount._ +* Assets - balances of user's assets **during last state update**. This means that the most recent updates to balance will not be reflected until the next state update. On the other hand, balance displayed on the Explorer is "proved" on Ethereum, which means that in case of triggering Escape Hatch functionality, that balance will be used to return funds to the user. +* Balance Changes - updates to users' balances in past state updates. It's important to remember that these are not single operations performed by the user, but their cumulative effect performed between subsequent state updates. -3. **Ethereum Interaction:** - _Screenshot: Ethereum transaction confirmation box._ - -4. **Awaiting Operator Action:** - _Screenshot: User dashboard showing a pending forced withdrawal._ - -5. **Final Step - Retrieving Funds:** - _Screenshot: Withdrawal area with a 'Claim Funds' button._ - -### Forced Trades: A Comprehensive Guide - -#### Why Forced Trades? - -Imagine wanting to withdraw all collateral from the exchange, but having open -positions. These positions need closing first. If, for any reason (like being -censored from the official UI), you can't use standard trade options, forced -trades come to the rescue. This feature lets you close positions by finding a -willing counterparty, even if you can't interact directly with StarkEx's primary -interface. - -1. **Choosing the Trade Option:** - _Screenshot: Open position options highlighting 'Sell/Buy' choices._ - -2. **Listing on the Database:** - _Screenshot: Explorer homepage showcasing 'Open Offers' section._ - -3. **Counterparty Interaction:** - _Screenshot: Trade offer acceptance confirmation._ - -4. **Finalizing the Trade:** - _Screenshot: User dashboard with 'Finalize Trade' prompt._ - ---- - -## 3. Delving into The Escape Hatch Mechanism - -### Understanding the Need for an Escape Hatch - -Exchanges, no matter how robust, can face unforeseen challenges. Operators might -become unresponsive, or perhaps a technical glitch temporarily halts activities. -In extreme cases, if StarkEx doesn't process a forced action within the expected -period, the entire system's integrity could be in jeopardy. The Escape Hatch is -a safeguard for these extraordinary situations. It's a drastic measure, ensuring -users can always retrieve their assets. - -### Exchange Freezing - -#### Why Freeze the Exchange? - -If operators neglect their duties or don't honor forced actions, users deserve a -way to protect their interests. Freezing is a punitive action against the -operator's unresponsiveness. It's a significant step that prevents any further -regular activity on StarkEx, switching it to a "safe mode" where only emergency -actions can take place. - -1. **Kickstarting the Escape:** - _Screenshot: 'Escape' button highlighted on the dashboard._ - -2. **Moving Forward - Finalization:** - _Screenshot: Dashboard prompt showcasing 'Finalize Escape' option._ - -3. **Concluding the Escape:** - _Screenshot: Withdrawal zone with 'Conclude Escape' option._ +Forced Transactions and Offers are described in a separate guide. Transactions (L2) are an optional panel which is available via custom integration with StarkEx operator, but validity of that data can't be verified. \ No newline at end of file diff --git a/packages/backend/src/content/tutorials/introduction2.md b/packages/backend/src/content/tutorials/introduction2.md deleted file mode 100644 index 4bd281598..000000000 --- a/packages/backend/src/content/tutorials/introduction2.md +++ /dev/null @@ -1,40 +0,0 @@ -# Introduction to StarkEx Explorer - -StarkEx Explorer is an open-source tool with Web interface which allows users to independently download, verify and browse data published to Ethereum by StarkEx systems. Additionally, it provides interface to perform so called "Forced Actions" and trigger "Escape hatch" functionalities, which are the main guarantees of self-custody of funds. - -## What is StarkEx - -StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading game applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx works in a "rollup mode", changes to user's balances are also published to Ethereum. In a "validium" mode, that data is published to a set of trusted operators, called Data Availability Committee (DAC). Even though L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero Knowledge proofs) which are published to Ethereum. This architecture allows users, in case of emergency (censorship or exchange shutdown) to independently and trustlessly withdraw their funds and tokens to Ethereum via one of 2 mechanisms: - -* Forced Actions - operations which must be included by StarkEx operators in a limited amount of time -* Escape Hatch - direct interaction with Ethereum contracts if Forced Actions are not honored by StarkEx operators - -This guide will explore how the StarkEx Explorer can be used to browse data published by StarkEx systems. - -To learn how it helps users in ensuring that their funds are safe and trades are valid see: - -* Accessing personal account data on StarkEx Explorer - -To learn how to perform Forced Actions and trigger Escape Hatch operations, see the following guides: - -* Performing Forced Actions -* Triggering Escape Hatch - -## Understanding data available on StarkEx Explorer - -An important feature of StarkEx system is that users are identified by their StarkKey, not their Ethereum address, even though they are related. Specifically, forced actions and escape hatch requires user's StarkKey to be explicitly mapped to their Ethereum address. This can happen automatically or via user action at any time, depending on the decision made by StarkEx operator. - -### State Updates - -Off-chain (L2) operations performed on StarkEx system update the system state (which includes users' balances). For example, when a user performs a trade with another user, their balances change accordingly. After some time (typically a few hours, but that depends on StarkEx Operator) a "State Update" is published to Ethereum (and DAC in validium mode). It includes *changes* that were made to user's balances since the last published state update. - -Users can browse all published state updates in the "State Updates" table. Clicking on any given state update displays its details, which includes Balance Changes for each StarkEKy. It's important to remember that they are not real transactions, but a total change that happened since previous state update. Specifically, user could have performed multiple operations in the time between two state updates, but only the final difference between the two will be presented in the Balance Changes table. - -### User Page - -Clicking on a specific Balance Change entry or searching for existing StarkKey or previously mapped Ethereum address presents "User Page", which displays: - -* Assets - balances of user's assets **during last state update**. This means that the most recent updates to balance will not be reflected until the next state update. On the other hand, balance displayed on the Explorer is "proved" on Ethereum, which means that in case of triggering Escape Hatch functionality, that balance will be used to return funds to the user. -* Balance Changes - updates to users' balances in past state updates. It's important to remember that these are not single operations performed by the user, but their cumulative effect performed between subsequent state updates. - -Forced Transactions and Offers are described in a separate guide. Transactions (L2) are an optional panel which is available via custom integration with StarkEx operator, but validity of that data can't be verified. \ No newline at end of file From 57cc4d052b247aa3cf17d32898a3140ea0693f06 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Sun, 5 Nov 2023 22:23:17 +0000 Subject: [PATCH 08/16] Display all tutorials with new icon --- .../src/content/tutorials/escapehatch.md | 2 +- .../src/content/tutorials/forcedactions.md | 2 +- packages/backend/src/core/TutorialService.ts | 36 ++++++++++-------- .../frontend/src/preview/data/tutorial.ts | 20 ++++------ .../src/static/images/introduction.jpg | Bin 19340 -> 0 bytes .../src/static/images/starkex-logo.png | Bin 0 -> 27090 bytes .../home/components/HomeSpotlightArticle.tsx | 3 +- .../pages/home/components/HomeTutorials.tsx | 6 +-- .../src/view/pages/tutorial/TutorialsPage.tsx | 5 +-- 9 files changed, 35 insertions(+), 39 deletions(-) delete mode 100644 packages/frontend/src/static/images/introduction.jpg create mode 100644 packages/frontend/src/static/images/starkex-logo.png diff --git a/packages/backend/src/content/tutorials/escapehatch.md b/packages/backend/src/content/tutorials/escapehatch.md index 483aae331..b212b5263 100644 --- a/packages/backend/src/content/tutorials/escapehatch.md +++ b/packages/backend/src/content/tutorials/escapehatch.md @@ -1,4 +1,4 @@ -# Escape Hatch functionality +# Escape Hatch explained For introduction to StarkEx explorer, see this guide: diff --git a/packages/backend/src/content/tutorials/forcedactions.md b/packages/backend/src/content/tutorials/forcedactions.md index c03a177fb..5125f6e40 100644 --- a/packages/backend/src/content/tutorials/forcedactions.md +++ b/packages/backend/src/content/tutorials/forcedactions.md @@ -1,4 +1,4 @@ -# Forced Actions +# All about Forced Actions For introduction to StarkEx explorer, see this guide: diff --git a/packages/backend/src/core/TutorialService.ts b/packages/backend/src/core/TutorialService.ts index 7e4548c7a..3c8c414f2 100644 --- a/packages/backend/src/core/TutorialService.ts +++ b/packages/backend/src/core/TutorialService.ts @@ -1,22 +1,26 @@ import { HomeTutorialEntry } from '@explorer/frontend' -import fs from 'fs' export class TutorialService { - getTutorials(): HomeTutorialEntry[] { - try { - const files = fs.readdirSync('src/content/tutorials') - return files.map((filename) => this.toTutorialEntry(filename)) - } catch { - return [] - } - } - private toTutorialEntry(filename: string): HomeTutorialEntry { - const filenameWithoutExt = filename.replace('.md', '') - return { - title: filenameWithoutExt.replaceAll('-', ' '), - imageUrl: `/images/${filenameWithoutExt}.jpg`, - slug: filenameWithoutExt.toLowerCase(), - } + getTutorials(): HomeTutorialEntry[] { + const tutorials: HomeTutorialEntry[] = [ + { + title: 'Introduction to StarkEx Explorer', + slug: 'introduction', + }, + { + title: 'Accessing User Page', + slug: 'userpage', + }, + { + title: 'All about Forced Actions', + slug: 'forcedactions', + }, + { + title: 'Escape Hatch explained', + slug: 'escapehatch', + }, + ] + return tutorials } } diff --git a/packages/frontend/src/preview/data/tutorial.ts b/packages/frontend/src/preview/data/tutorial.ts index 8dbe72676..c4b0e5202 100644 --- a/packages/frontend/src/preview/data/tutorial.ts +++ b/packages/frontend/src/preview/data/tutorial.ts @@ -137,23 +137,19 @@ line 3 of code export const tutorials: HomeTutorialEntry[] = [ { - title: 'Learn how to use StarkEx Explorer efficiently', - imageUrl: '/images/tutorial.jpg', - slug: 'learn-how-to-use-starkex-explorer-efficiently', + title: 'Introduction to StarkEx Explorer', + slug: 'introduction', }, { - title: 'All about forced transactions', - imageUrl: '/images/tutorial.jpg', - slug: 'all-about-forced-transactions', + title: 'Accessing User Page', + slug: 'userpage', }, { - title: 'Stark key registration', - imageUrl: '/images/tutorial.jpg', - slug: 'stark-key-registration', + title: 'All about Forced Actions', + slug: 'forcedactions', }, { - title: 'Escape hatches explained', - imageUrl: '/images/tutorial.jpg', - slug: 'escape-hatch-explained', + title: 'Escape Hatch explained', + slug: 'escapehatch', }, ] diff --git a/packages/frontend/src/static/images/introduction.jpg b/packages/frontend/src/static/images/introduction.jpg deleted file mode 100644 index 7929b4b05099bcd9aafd11a7930c439de8198c52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19340 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 diff --git a/packages/frontend/src/static/images/starkex-logo.png b/packages/frontend/src/static/images/starkex-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5e59ae056e6fa76de39e042a0eabb99f1607f7 GIT binary patch literal 27090 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

) diff --git a/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx b/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx index 6578c0d6e..85244a8c4 100644 --- a/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx +++ b/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx @@ -8,7 +8,6 @@ import { SectionHeading } from '../../../components/SectionHeading' export interface HomeTutorialEntry { title: string - imageUrl: string slug: string } interface HomeTutorialsProps { @@ -38,9 +37,8 @@ export function HomeTutorials(props: HomeTutorialsProps) { className="group flex w-full items-center gap-4" >

diff --git a/packages/frontend/src/view/pages/tutorial/TutorialsPage.tsx b/packages/frontend/src/view/pages/tutorial/TutorialsPage.tsx index a31a5b75a..625a4f60c 100644 --- a/packages/frontend/src/view/pages/tutorial/TutorialsPage.tsx +++ b/packages/frontend/src/view/pages/tutorial/TutorialsPage.tsx @@ -30,9 +30,8 @@ export function TutorialsPage(props: TutorialsPageProps) { {props.tutorials.map((tutorial, i) => (

From 6a0e36275311a718f432d3e4ded394414c257b4e Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Mon, 6 Nov 2023 20:44:43 +0000 Subject: [PATCH 09/16] Open tutorial links in the same tab --- packages/backend/src/utils/markdown/getHtmlFromMarkdown.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/backend/src/utils/markdown/getHtmlFromMarkdown.ts b/packages/backend/src/utils/markdown/getHtmlFromMarkdown.ts index 3bec0cee1..fa379128e 100644 --- a/packages/backend/src/utils/markdown/getHtmlFromMarkdown.ts +++ b/packages/backend/src/utils/markdown/getHtmlFromMarkdown.ts @@ -12,7 +12,6 @@ export function getHtmlFromMarkdown(filePath: string) { $('a').each(function () { const $el = $(this) $el.attr('rel', 'noopener noreferrer') - $el.attr('target', '_blank') }) $('h1, h2, h3, h4, h5, h6').each(function () { const $el = $(this) From 62d22737cd09954bdb19119ed8c9e85d516cff1d Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Mon, 6 Nov 2023 20:45:01 +0000 Subject: [PATCH 10/16] Correct introduction --- .../src/content/tutorials/introduction.md | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/backend/src/content/tutorials/introduction.md b/packages/backend/src/content/tutorials/introduction.md index 4bd281598..ae0f5a946 100644 --- a/packages/backend/src/content/tutorials/introduction.md +++ b/packages/backend/src/content/tutorials/introduction.md @@ -1,40 +1,40 @@ # Introduction to StarkEx Explorer -StarkEx Explorer is an open-source tool with Web interface which allows users to independently download, verify and browse data published to Ethereum by StarkEx systems. Additionally, it provides interface to perform so called "Forced Actions" and trigger "Escape hatch" functionalities, which are the main guarantees of self-custody of funds. +StarkEx Explorer is an open-source tool with a Web interface that allows users to independently download, verify, and browse data published to Ethereum by StarkEx systems. Additionally, it provides an interface to perform so-called "Forced Actions" and trigger "Escape Hatch" functionalities, which are the main guarantees of self-custody of funds. ## What is StarkEx -StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading game applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx works in a "rollup mode", changes to user's balances are also published to Ethereum. In a "validium" mode, that data is published to a set of trusted operators, called Data Availability Committee (DAC). Even though L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero Knowledge proofs) which are published to Ethereum. This architecture allows users, in case of emergency (censorship or exchange shutdown) to independently and trustlessly withdraw their funds and tokens to Ethereum via one of 2 mechanisms: +StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx operates in a "rollup mode," changes to users' balances are also published to Ethereum. In "validium" mode, that data is published to a set of trusted operators, known as the Data Availability Committee (DAC). Although L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero-Knowledge proofs) which are published to Ethereum. This architecture allows users, in case of emergency (such as censorship or exchange shutdown), to independently and trustlessly withdraw their funds and tokens to Ethereum using one of two mechanisms: -* Forced Actions - operations which must be included by StarkEx operators in a limited amount of time -* Escape Hatch - direct interaction with Ethereum contracts if Forced Actions are not honored by StarkEx operators +- Forced Actions - operations that must be included by StarkEx operators within a limited amount of time +- Escape Hatch - direct interaction with Ethereum contracts if Forced Actions are not honored by StarkEx operators This guide will explore how the StarkEx Explorer can be used to browse data published by StarkEx systems. -To learn how it helps users in ensuring that their funds are safe and trades are valid see: +To learn how it helps users ensure that their funds are safe and trades are valid, see: -* Accessing personal account data on StarkEx Explorer +- [Accessing User Page](/tutorials/userpage) To learn how to perform Forced Actions and trigger Escape Hatch operations, see the following guides: -* Performing Forced Actions -* Triggering Escape Hatch +- [All about Forced Actions](/tutorials/forcedactions) +- [Escape Hatch Explained](/tutorials/escapehatch) -## Understanding data available on StarkEx Explorer +## Understanding Data Available on StarkEx Explorer -An important feature of StarkEx system is that users are identified by their StarkKey, not their Ethereum address, even though they are related. Specifically, forced actions and escape hatch requires user's StarkKey to be explicitly mapped to their Ethereum address. This can happen automatically or via user action at any time, depending on the decision made by StarkEx operator. +A notable feature of the StarkEx system is that users are identified by their StarkKey, not their Ethereum address, although they are related. Specifically, forced actions and the escape hatch require a user's StarkKey to be explicitly mapped to their Ethereum address. This can happen automatically or via user action at any time, depending on the decision made by the StarkEx operator. ### State Updates -Off-chain (L2) operations performed on StarkEx system update the system state (which includes users' balances). For example, when a user performs a trade with another user, their balances change accordingly. After some time (typically a few hours, but that depends on StarkEx Operator) a "State Update" is published to Ethereum (and DAC in validium mode). It includes *changes* that were made to user's balances since the last published state update. +Off-chain (L2) operations performed on the StarkEx system update the system state (which includes users' balances). For instance, when a user trades with another user, their balances change accordingly. After some time (typically a few hours, but this depends on the StarkEx Operator), a "State Update" is published to Ethereum (and to the DAC in validium mode). It includes the _changes_ that were made to users' balances since the last published state update. -Users can browse all published state updates in the "State Updates" table. Clicking on any given state update displays its details, which includes Balance Changes for each StarkEKy. It's important to remember that they are not real transactions, but a total change that happened since previous state update. Specifically, user could have performed multiple operations in the time between two state updates, but only the final difference between the two will be presented in the Balance Changes table. +Users can browse all published state updates in the "State Updates" table. Clicking on any given state update displays its details, which includes the Balance Changes for each StarkKey. It's important to remember that these are not real transactions but the total change that occurred since the previous state update. Specifically, a user could have performed multiple operations in the time between two state updates, but only the final difference between the two will be presented in the Balance Changes table. ### User Page -Clicking on a specific Balance Change entry or searching for existing StarkKey or previously mapped Ethereum address presents "User Page", which displays: +Clicking on a specific Balance Change entry or searching for an existing StarkKey or previously mapped Ethereum address presents the "User Page," which displays: -* Assets - balances of user's assets **during last state update**. This means that the most recent updates to balance will not be reflected until the next state update. On the other hand, balance displayed on the Explorer is "proved" on Ethereum, which means that in case of triggering Escape Hatch functionality, that balance will be used to return funds to the user. -* Balance Changes - updates to users' balances in past state updates. It's important to remember that these are not single operations performed by the user, but their cumulative effect performed between subsequent state updates. +- Assets - the balances of the user's assets **during the last state update**. This means that the most recent updates to the balance will not be reflected until the next state update. On the other hand, the balance displayed on the Explorer is "proved" on Ethereum, which means that in the case of triggering Escape Hatch functionality, that balance will be used to return funds to the user. +- Balance Changes - updates to users' balances in past state updates. It's important to remember that these are not single operations performed by the user, but their cumulative effect between subsequent state updates. -Forced Transactions and Offers are described in a separate guide. Transactions (L2) are an optional panel which is available via custom integration with StarkEx operator, but validity of that data can't be verified. \ No newline at end of file +Forced Transactions and Offers are described in a separate guide ([All about Forced Actions](/tutorials/forcedactions)). The Transactions (L2) panel is an optional feature available via custom integration with the StarkEx operator, but the validity of that data cannot be verified. From 464724a20b7b3843c700630a7cb00b035831e40c Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Mon, 6 Nov 2023 20:45:07 +0000 Subject: [PATCH 11/16] Add links to tutorials --- packages/backend/src/content/tutorials/escapehatch.md | 4 ++-- packages/backend/src/content/tutorials/forcedactions.md | 4 ++-- packages/backend/src/content/tutorials/userpage.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/content/tutorials/escapehatch.md b/packages/backend/src/content/tutorials/escapehatch.md index b212b5263..6031d8b23 100644 --- a/packages/backend/src/content/tutorials/escapehatch.md +++ b/packages/backend/src/content/tutorials/escapehatch.md @@ -2,11 +2,11 @@ For introduction to StarkEx explorer, see this guide: -* Introduction +* [Introduction to StarkEx Explorer](/tutorials/introduction) Escape Hatch is a functionality available as the last resort for a user to withdraw their funds from StarkEx system to Ethereum. -When the StarkEx system is operating normally but user is unable to use regular interface (e.g. Exchange's web page), they should trigger a Forced Action request, described in a separate guide, to attempt withdrawal of their funds. When such Forced Action is not honored in a predefined amount of time (configured by StarkEx, usually 7 or 14 days), either due to inaction or because the operator is not functioning at all, StarkEx Explorer will detect this state and show an option in the website header to "Request Freeze" of the exchange. +When the StarkEx system is operating normally but user is unable to use regular interface (e.g. Exchange's web page), they should trigger a Forced Action request, described in a separate guide ([All about Forced Actions](/tutorials/forcedactions)), to attempt withdrawal of their funds. When such Forced Action is not honored in a predefined amount of time (configured by StarkEx, usually 7 or 14 days), either due to inaction or because the operator is not functioning at all, StarkEx Explorer will detect this state and show an option in the website header to "Request Freeze" of the exchange. ## Exchange Freeze diff --git a/packages/backend/src/content/tutorials/forcedactions.md b/packages/backend/src/content/tutorials/forcedactions.md index 5125f6e40..30148b48e 100644 --- a/packages/backend/src/content/tutorials/forcedactions.md +++ b/packages/backend/src/content/tutorials/forcedactions.md @@ -2,7 +2,7 @@ For introduction to StarkEx explorer, see this guide: -* Introduction +* [Introduction to StarkEx Explorer](/tutorials/introduction) Forced Actions are special operations initiated via Ethereum blockchain. They are special emergency measures that should not be used under normal conditions due to their high cost and slow time of execution. They are useful when: @@ -33,7 +33,7 @@ Created Forced Withdrawal request will be visible on User Page in "Forced transa After initiating Forced Withdrawal, StarkEx operators have a predefined amount of time (usually 7 or 14 days) to perform requested withdrawal. When they do, User Page will display a "Withdrawable assets" section with a "Withdraw now" button to trigger the final transfer of funds to user's Ethereum account. -If StarkEx Operator doesn't honor user's Forced Withdrawal request if given time, user will be able to trigger Exchange Freeze and trigger Escape Hatch functionality, described in a separate guide. +If StarkEx Operator doesn't honor user's Forced Withdrawal request if given time, user will be able to trigger Exchange Freeze and trigger Escape Hatch functionality, described in a separate guide ([Escape Hatch explained](/tutorials/escapehatch)). It's important to notice that nothing stops users from manually triggering Forced Withdrawals with incorrect amounts. Such requests will still be processed by StarkEx system, but due to their invalid data they will not trigger the final withdrawal. diff --git a/packages/backend/src/content/tutorials/userpage.md b/packages/backend/src/content/tutorials/userpage.md index 3b80beb1f..a2632a2cf 100644 --- a/packages/backend/src/content/tutorials/userpage.md +++ b/packages/backend/src/content/tutorials/userpage.md @@ -2,7 +2,7 @@ For introduction to StarkEx explorer, see this guide: -* Introduction +* [Introduction to StarkEx Explorer](/tutorials/introduction) Accessing user page is possible in multiple ways. From 409b2aaf796e4764f3281818be4e03c68896d559 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Mon, 6 Nov 2023 20:46:13 +0000 Subject: [PATCH 12/16] Correct userpage tutorial --- .../backend/src/content/tutorials/userpage.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/backend/src/content/tutorials/userpage.md b/packages/backend/src/content/tutorials/userpage.md index a2632a2cf..2cde20454 100644 --- a/packages/backend/src/content/tutorials/userpage.md +++ b/packages/backend/src/content/tutorials/userpage.md @@ -1,17 +1,15 @@ # Accessing User Page -For introduction to StarkEx explorer, see this guide: +For an introduction to StarkEx Explorer, see this guide: * [Introduction to StarkEx Explorer](/tutorials/introduction) -Accessing user page is possible in multiple ways. +Accessing the user page is possible in multiple ways: -* If user knows the StarkKey, they can simply search for it using the search box. -* If user knows the Ethereum address, they can also search for it, but only if that address was previously **registered as an owner of a StarkKey**. On some exchanges this process happens automatically, but due to its high cost it is currently discouraged. -* Connecting via Metamask to calculate their StarkKey using their Ethereum account - -# Connecting via Metamask - -When user clicks on the "Connect wallet" button and approves the connection in Metamask wallet, the Explorer checks if user's Ethereum address is already "registered", i.e. mapped to a StarkKey. If it's not, user will be presented with an option to "Recover StarkKey". This operation is free of cost. By clicking on the "Recover" button, user will be presented with a "Signature request" by the Metamask interface. It is important to read the message that is supposed to be signed - it should be a sign-on request to an exchange. By "clicking" on the "Sign" button, user's StarkKey will be calculated based on their Ethereum account (using private key signature) and user will be redirected to their User Page. +* If the user knows their StarkKey, they can simply search for it using the search box. +* If the user knows their Ethereum address, they can also search for it, but only if that address was previously **registered as an owner of a StarkKey**. On some exchanges, this process happens automatically, but due to its high cost, it is currently discouraged. +* Connecting via MetaMask to calculate their StarkKey using their Ethereum account. +## Connecting via MetaMask +When a user clicks on the "Connect wallet" button and approves the connection in their MetaMask wallet, the Explorer checks if the user's Ethereum address is already "registered," i.e., mapped to a StarkKey. If it's not, the user will be presented with an option to "Recover StarkKey." This operation is free of cost. By clicking on the "Recover" button, the user will be presented with a "Signature request" by the MetaMask interface. It is important to read the message that is supposed to be signed—it should be a sign-on request to an exchange. By "clicking" on the "Sign" button, the user's StarkKey will be calculated based on their Ethereum account (using the private key signature), and the user will be redirected to their User Page. From 7190c179592eb5c624451b13341f11b2f4b2fc92 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Mon, 6 Nov 2023 20:53:29 +0000 Subject: [PATCH 13/16] Correct forcedactions tutorial --- .../src/content/tutorials/forcedactions.md | 65 ++++++++----------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/packages/backend/src/content/tutorials/forcedactions.md b/packages/backend/src/content/tutorials/forcedactions.md index 30148b48e..91d3f5a83 100644 --- a/packages/backend/src/content/tutorials/forcedactions.md +++ b/packages/backend/src/content/tutorials/forcedactions.md @@ -1,63 +1,54 @@ # All about Forced Actions -For introduction to StarkEx explorer, see this guide: +For an introduction to the StarkEx Explorer, see this guide: * [Introduction to StarkEx Explorer](/tutorials/introduction) -Forced Actions are special operations initiated via Ethereum blockchain. They are special emergency measures that should not be used under normal conditions due to their high cost and slow time of execution. They are useful when: +Forced Actions are special operations initiated via the Ethereum blockchain. They are emergency measures that **should not be used under normal conditions** due to their high cost and slow execution time. They are useful when: -* the StarkEx system (e.g. exchange) is operating normally, -* but user is not able to access system's native interface (e.g. Exchange's website) for example due to censorship +* the StarkEx system (e.g., an exchange) is operating normally, +* but the user cannot access the system's native interface (e.g., the exchange's website), for example, due to censorship. -In such scenario, forced actions provide an emergency exit route to withdraw user's assets to Ethereum. +In such scenarios, forced actions provide an emergency exit route for users to withdraw their assets to Ethereum. -If the StarkEx system is not operating normally (e.g. operator's servers have been shut down completely), user will need to use an Escape Hatch, which is an expensive, last resort solution. +If the StarkEx system is not operating normally (e.g., the operator's servers have been shut down completely), users will need to use the Escape Hatch, which is an expensive last-resort solution. ### Forced Withdrawal -Forced Withdrawals can be used to withdraw user assets, except for "perpetuals". If there are any perpetual positions open, they should be closed via "Forced Trade" before a Forced Withdrawal is attempted. +Forced Withdrawals are used to withdraw user assets, except for "perpetual assets". If any perpetual positions are open, they must be closed via a "Forced Trade" before attempting a Forced Withdrawal. -To initiate a Forced Withdrawal, user should: +To initiate a Forced Withdrawal, users should: -1. Open their User Page +1. Open their User Page. +2. Click on the "Withdraw" button next to their token (collateral) entry in the "Assets" table. +3. Optional: If the user's Ethereum address has not been registered on Ethereum (meaning that Ethereum contracts do not recognize which StarkKey belongs to that Ethereum address), they will be prompted to do so via an Ethereum transaction. +4. Enter the requested amount to withdraw. StarkEx in Spot trading mode will only allow the withdrawal of the full balance. +5. Click on the "Prepare for withdrawal" button and send the requested transaction to Ethereum. -1. Click on the "Withdraw" button next to their token (collateral) entry in "Assets" table. +The created Forced Withdrawal request will be visible on the User Page in the "Forced transactions" panel. -1. Optional: if user's Ethereum address has not been registered on Ethereum (which means that Ethereum contracts don't know which StarkKey belongs to that Ethereum address), they will be asked to do it via an Ethereum transaction. +After initiating a Forced Withdrawal, StarkEx operators have a predefined amount of time (usually 7 or 14 days) to process the requested withdrawal. When they do, the User Page will display a "Withdrawable assets" section with a "Withdraw now" button to trigger the final transfer of funds to the user's Ethereum account. -1. Enter requested amount to withdraw. StarkEx in a Spot trading mode will only allow to withdraw the full balance. +If the StarkEx Operator does not honor the user's Forced Withdrawal request within the given time, the user will be able to trigger an Exchange Freeze and engage the Escape Hatch functionality, described in a separate guide ([Escape Hatch explained](/tutorials/escapehatch)). -1. Click on "Prepare for withdrawal" button and send the requested transaction to Ethereum. - -Created Forced Withdrawal request will be visible on User Page in "Forced transactions" panel. - -After initiating Forced Withdrawal, StarkEx operators have a predefined amount of time (usually 7 or 14 days) to perform requested withdrawal. When they do, User Page will display a "Withdrawable assets" section with a "Withdraw now" button to trigger the final transfer of funds to user's Ethereum account. - -If StarkEx Operator doesn't honor user's Forced Withdrawal request if given time, user will be able to trigger Exchange Freeze and trigger Escape Hatch functionality, described in a separate guide ([Escape Hatch explained](/tutorials/escapehatch)). - -It's important to notice that nothing stops users from manually triggering Forced Withdrawals with incorrect amounts. Such requests will still be processed by StarkEx system, but due to their invalid data they will not trigger the final withdrawal. +It is important to note that users can manually initiate Forced Withdrawals with incorrect amounts. Such requests will be processed by the StarkEx system, but due to their invalid data, they will not trigger the final withdrawal. ### Forced Trades -Forced Trades are special actions required to close open perpetual positions. - -To initiate a Forced Trade, user should: - -1. Open their User Page - -1. Click on the "Close" button next to their perpetual asset entry in "Assets" table. If user's position is "long", it would trigger a "Sell" trade, or "Buy" in case of a "short" position. - -1. Optional: if user's Ethereum address has not been registered on Ethereum (which means that Ethereum contracts don't know which StarkKey belongs to that Ethereum address), they will be asked to do it via an Ethereum transaction. - -1. Enter desired trade data (perpetual amount and price) +Forced Trades are required to close open perpetual positions. -1. Click on "Create buy/sell offer" button, which will require a user to sign with their Metamask wallet. +To initiate a Forced Trade, users should: +1. Open their User Page. +2. Click on the "Close" button next to their perpetual asset entry in the "Assets" table. If the user's position is "long", this would trigger a "Sell" trade, or a "Buy" if the position is "short". +3. Optional: If the user's Ethereum address has not been registered on Ethereum (meaning that Ethereum contracts do not recognize which StarkKey belongs to that Ethereum address), they will be prompted to do so via an Ethereum transaction. +4. Enter the desired trade data (perpetual amount and price). +5. Click on the "Create buy/sell offer" button, which will require the user to sign with their MetaMask wallet. -Such trade will be visible on the StarkEx Explorer Home Page and on user's User Page in the "Offers" panel. +Such a trade will be visible on the StarkEx Explorer Home Page and on the user's User Page in the "Offers" panel. -Offers are internal to StarkEx explorer and are not visible neither on Ethereum nor on the StarkEx system. +Offers are internal to the StarkEx Explorer and are not visible on Ethereum or within the StarkEx system. -Offer needs to be accepted by a counterpart via interaction with the offer on the Explorer. When some user "Accepts" the offer, original creator can either cancel or approve it by sending a Forced Withdrawal transaction to Ethereum. +An offer needs to be accepted by a counterpart via interaction with the offer on the Explorer. When a user "Accepts" the offer, the original creator can either cancel or approve it by sending a Forced Withdrawal transaction to Ethereum. -Just like the Forced Withdrawal process, StarkEx Operator has limited time to honor this trade. If they do, the position will disappear from user's User Page and collateral asset balance will be updated accordingly. Otherwise, user will be able to use Escape Hatch Functionality. \ No newline at end of file +Just like with the Forced Withdrawal process, the StarkEx Operator has limited time to honor this trade. If they do, the position will disappear from the user's User Page, and the collateral asset balance will be updated accordingly. Otherwise, the user will be able to use the Escape Hatch functionality. From a9599c71f645f199b6810af7134b1e02f36da910 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Mon, 6 Nov 2023 20:58:42 +0000 Subject: [PATCH 14/16] Correct escapehatch tutorial --- .../src/content/tutorials/escapehatch.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/backend/src/content/tutorials/escapehatch.md b/packages/backend/src/content/tutorials/escapehatch.md index 6031d8b23..cf6802e9b 100644 --- a/packages/backend/src/content/tutorials/escapehatch.md +++ b/packages/backend/src/content/tutorials/escapehatch.md @@ -1,21 +1,21 @@ -# Escape Hatch explained +# Escape Hatch Explained -For introduction to StarkEx explorer, see this guide: +For an introduction to StarkEx Explorer, see this guide: * [Introduction to StarkEx Explorer](/tutorials/introduction) -Escape Hatch is a functionality available as the last resort for a user to withdraw their funds from StarkEx system to Ethereum. - -When the StarkEx system is operating normally but user is unable to use regular interface (e.g. Exchange's web page), they should trigger a Forced Action request, described in a separate guide ([All about Forced Actions](/tutorials/forcedactions)), to attempt withdrawal of their funds. When such Forced Action is not honored in a predefined amount of time (configured by StarkEx, usually 7 or 14 days), either due to inaction or because the operator is not functioning at all, StarkEx Explorer will detect this state and show an option in the website header to "Request Freeze" of the exchange. +Escape Hatch is a functionality available as the last resort for users to withdraw their funds from the StarkEx system to Ethereum. +When the StarkEx system is operating normally but a user is unable to use the regular interface (e.g., an exchange's web page), they should initiate a Forced Action request, as described in a separate guide ([All about Forced Actions](/tutorials/forcedactions)), to attempt the withdrawal of their funds. If Forced Action is not honored within a predefined amount of time (configured by StarkEx, usually 7 or 14 days), either due to inaction or because the operator is not functioning, the StarkEx Explorer will detect this state and display an option in the website header to "Request Freeze" of the StarkEx system. + ## Exchange Freeze -Freezing the exchange can be performed by any user if at least one Forced Action hasn't been honored by StarkEx Operator in predefined time. By clicking on the "Requste Freeze" button and approving Metamask transaction, the whole StarkEx system will enter a frozen state, in which no off-chain (L2) operations can be performed (e.g. no trades) and the only option available to the users will be to request withdrawal of their full balances. +Freezing the StarkEx system can be initiated by any user if at least one Forced Action has not been honored by the StarkEx Operator within the predefined time. By clicking on the "Request Freeze" button and confirming the Metamask transaction, the entire StarkEx system will enter a frozen state, in which no off-chain (L2) operations can be performed (e.g., no trades), and users will only be able to request the withdrawal of their full balances. -StarkEx Explorer's interface will change accordingly, the webpage header will display appropriate message on each page, and operations available to users will also change accordingly. +The StarkEx Explorer's interface will change accordingly, with the webpage header displaying an appropriate message on each page, and operations available to users will be altered as well. -## Performing Escape +## Performing an Escape -After user visits their User Page, there will be an "Escape" button available next to their non-perpetual tokens in the Assets panel (perpatual positions' values are automatically included in the collateral escape). After clicking on the button, if user's Ethereum address has not been registered on Ethereum (which means that Ethereum contracts don't know which StarkKey belongs to that Ethereum address), they will be asked to do it via an Ethereum transaction. Next, user will be presented with description of the escape process and asked to click on the "Initiate Escape" button. This will trigger a Metamask transaction, which can be very costly due to the amount of data, specifically a Merkle Proof which proves to the Ethereum smart contract that user is indeed the owner of given amount of assets as of the last state update. +After visiting their User Page, users will find an "Escape" button next to their non-perpetual tokens in the Assets panel (the values of perpetual positions are automatically included in the collateral escape). Upon clicking this button, if a user's Ethereum address has not been registered on Ethereum (which implies that Ethereum contracts do not recognize which StarkKey belongs to that Ethereum address), they will need to register it via an Ethereum transaction. Next, the user will be presented with a description of the escape process and prompted to click on the "Initiate Escape" button. This action will prompt a Metamask transaction, which may incur significant cost due to the amount of data, specifically a Merkle Proof, which proves to the Ethereum smart contract that the user indeed owns the claimed assets as of the last state update. -Once the transaction is mined on Ethereum, User Page will display a panel with "Pending escapes" section. Clicking on "Finalize Escape" button next to an asset will trigger user to send a transaction via Metamask which will perform the transfer of funds to user's Ethereum wallet. \ No newline at end of file +Once the transaction has been confirmed on Ethereum, the User Page will display a "Pending Escapes" section. By clicking on the "Finalize Escape" button next to an asset, the user will be prompted to send a transaction via Metamask, which will complete the transfer of funds to the user's Ethereum wallet. From ecdbb7e239a21e641d1c15c1a920445fdac04186 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Mon, 6 Nov 2023 21:13:38 +0000 Subject: [PATCH 15/16] Fix typo and clarify wording in introduction.md --- packages/backend/src/content/tutorials/introduction.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/content/tutorials/introduction.md b/packages/backend/src/content/tutorials/introduction.md index ae0f5a946..ff2b890d4 100644 --- a/packages/backend/src/content/tutorials/introduction.md +++ b/packages/backend/src/content/tutorials/introduction.md @@ -4,7 +4,7 @@ StarkEx Explorer is an open-source tool with a Web interface that allows users t ## What is StarkEx -StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx operates in a "rollup mode," changes to users' balances are also published to Ethereum. In "validium" mode, that data is published to a set of trusted operators, known as the Data Availability Committee (DAC). Although L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero-Knowledge proofs) which are published to Ethereum. This architecture allows users, in case of emergency (such as censorship or exchange shutdown), to independently and trustlessly withdraw their funds and tokens to Ethereum using one of two mechanisms: +StarkEx is an Ethereum Layer 2 (L2) system targeting DeFi and trading applications. While most operations (like trading and creating orders) are created and executed off-chain for speed and low cost, users' balances are periodically hashed (in the form of a "Merkle Root") and published to Ethereum. If StarkEx operates in a "rollup mode," changes to users' balances are also published to Ethereum. In "validium" mode, that data is published to a set of trusted operators, known as the Data Availability Committee (DAC). Although L2 transactions are not published to Ethereum, their validity is ensured via validity proofs (specifically STARK Zero-Knowledge proofs) which are published to Ethereum. This architecture allows users, in case of emergency (such as censorship or exchange shutdown), to independently and trustlessly withdraw their assets to Ethereum using one of two mechanisms: - Forced Actions - operations that must be included by StarkEx operators within a limited amount of time - Escape Hatch - direct interaction with Ethereum contracts if Forced Actions are not honored by StarkEx operators @@ -28,13 +28,13 @@ A notable feature of the StarkEx system is that users are identified by their St Off-chain (L2) operations performed on the StarkEx system update the system state (which includes users' balances). For instance, when a user trades with another user, their balances change accordingly. After some time (typically a few hours, but this depends on the StarkEx Operator), a "State Update" is published to Ethereum (and to the DAC in validium mode). It includes the _changes_ that were made to users' balances since the last published state update. -Users can browse all published state updates in the "State Updates" table. Clicking on any given state update displays its details, which includes the Balance Changes for each StarkKey. It's important to remember that these are not real transactions but the total change that occurred since the previous state update. Specifically, a user could have performed multiple operations in the time between two state updates, but only the final difference between the two will be presented in the Balance Changes table. +Users can browse all published state updates in the "State Updates" table. Clicking on any given state update displays its details, which includes the Balance Changes for each StarkKey. It's important to remember that these are not actual transactions but the total change that occurred since the previous state update. Specifically, a user could have performed multiple operations in the time between two state updates, but only the final difference between the two will be presented in the Balance Changes table. ### User Page Clicking on a specific Balance Change entry or searching for an existing StarkKey or previously mapped Ethereum address presents the "User Page," which displays: -- Assets - the balances of the user's assets **during the last state update**. This means that the most recent updates to the balance will not be reflected until the next state update. On the other hand, the balance displayed on the Explorer is "proved" on Ethereum, which means that in the case of triggering Escape Hatch functionality, that balance will be used to return funds to the user. +- Assets - the balances of the user's assets **during the last state update**. This means that the most recent balance changes that occurred after the last state update will not be reflected on the Explorer. This is intentional, because only balances published to Ethereum will be considered if an emergency Escape Hatch functionality needs to be triggered. - Balance Changes - updates to users' balances in past state updates. It's important to remember that these are not single operations performed by the user, but their cumulative effect between subsequent state updates. Forced Transactions and Offers are described in a separate guide ([All about Forced Actions](/tutorials/forcedactions)). The Transactions (L2) panel is an optional feature available via custom integration with the StarkEx operator, but the validity of that data cannot be verified. From 130a62b2ad7e84fd4630f93823ff434c80418b69 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Tue, 7 Nov 2023 07:19:44 +0000 Subject: [PATCH 16/16] Fix formatting --- packages/backend/src/content/tutorials/escapehatch.md | 4 ++-- packages/backend/src/content/tutorials/forcedactions.md | 6 +++--- packages/backend/src/content/tutorials/userpage.md | 8 ++++---- packages/backend/src/core/TutorialService.ts | 1 - .../view/pages/home/components/HomeSpotlightArticle.tsx | 4 +--- .../src/view/pages/home/components/HomeTutorials.tsx | 5 +---- 6 files changed, 11 insertions(+), 17 deletions(-) diff --git a/packages/backend/src/content/tutorials/escapehatch.md b/packages/backend/src/content/tutorials/escapehatch.md index cf6802e9b..054d88e21 100644 --- a/packages/backend/src/content/tutorials/escapehatch.md +++ b/packages/backend/src/content/tutorials/escapehatch.md @@ -2,12 +2,12 @@ For an introduction to StarkEx Explorer, see this guide: -* [Introduction to StarkEx Explorer](/tutorials/introduction) +- [Introduction to StarkEx Explorer](/tutorials/introduction) Escape Hatch is a functionality available as the last resort for users to withdraw their funds from the StarkEx system to Ethereum. When the StarkEx system is operating normally but a user is unable to use the regular interface (e.g., an exchange's web page), they should initiate a Forced Action request, as described in a separate guide ([All about Forced Actions](/tutorials/forcedactions)), to attempt the withdrawal of their funds. If Forced Action is not honored within a predefined amount of time (configured by StarkEx, usually 7 or 14 days), either due to inaction or because the operator is not functioning, the StarkEx Explorer will detect this state and display an option in the website header to "Request Freeze" of the StarkEx system. - + ## Exchange Freeze Freezing the StarkEx system can be initiated by any user if at least one Forced Action has not been honored by the StarkEx Operator within the predefined time. By clicking on the "Request Freeze" button and confirming the Metamask transaction, the entire StarkEx system will enter a frozen state, in which no off-chain (L2) operations can be performed (e.g., no trades), and users will only be able to request the withdrawal of their full balances. diff --git a/packages/backend/src/content/tutorials/forcedactions.md b/packages/backend/src/content/tutorials/forcedactions.md index 91d3f5a83..dab1cab9a 100644 --- a/packages/backend/src/content/tutorials/forcedactions.md +++ b/packages/backend/src/content/tutorials/forcedactions.md @@ -2,12 +2,12 @@ For an introduction to the StarkEx Explorer, see this guide: -* [Introduction to StarkEx Explorer](/tutorials/introduction) +- [Introduction to StarkEx Explorer](/tutorials/introduction) Forced Actions are special operations initiated via the Ethereum blockchain. They are emergency measures that **should not be used under normal conditions** due to their high cost and slow execution time. They are useful when: -* the StarkEx system (e.g., an exchange) is operating normally, -* but the user cannot access the system's native interface (e.g., the exchange's website), for example, due to censorship. +- the StarkEx system (e.g., an exchange) is operating normally, +- but the user cannot access the system's native interface (e.g., the exchange's website), for example, due to censorship. In such scenarios, forced actions provide an emergency exit route for users to withdraw their assets to Ethereum. diff --git a/packages/backend/src/content/tutorials/userpage.md b/packages/backend/src/content/tutorials/userpage.md index 2cde20454..f64f95dca 100644 --- a/packages/backend/src/content/tutorials/userpage.md +++ b/packages/backend/src/content/tutorials/userpage.md @@ -2,13 +2,13 @@ For an introduction to StarkEx Explorer, see this guide: -* [Introduction to StarkEx Explorer](/tutorials/introduction) +- [Introduction to StarkEx Explorer](/tutorials/introduction) Accessing the user page is possible in multiple ways: -* If the user knows their StarkKey, they can simply search for it using the search box. -* If the user knows their Ethereum address, they can also search for it, but only if that address was previously **registered as an owner of a StarkKey**. On some exchanges, this process happens automatically, but due to its high cost, it is currently discouraged. -* Connecting via MetaMask to calculate their StarkKey using their Ethereum account. +- If the user knows their StarkKey, they can simply search for it using the search box. +- If the user knows their Ethereum address, they can also search for it, but only if that address was previously **registered as an owner of a StarkKey**. On some exchanges, this process happens automatically, but due to its high cost, it is currently discouraged. +- Connecting via MetaMask to calculate their StarkKey using their Ethereum account. ## Connecting via MetaMask diff --git a/packages/backend/src/core/TutorialService.ts b/packages/backend/src/core/TutorialService.ts index 3c8c414f2..2a4136350 100644 --- a/packages/backend/src/core/TutorialService.ts +++ b/packages/backend/src/core/TutorialService.ts @@ -1,7 +1,6 @@ import { HomeTutorialEntry } from '@explorer/frontend' export class TutorialService { - getTutorials(): HomeTutorialEntry[] { const tutorials: HomeTutorialEntry[] = [ { diff --git a/packages/frontend/src/view/pages/home/components/HomeSpotlightArticle.tsx b/packages/frontend/src/view/pages/home/components/HomeSpotlightArticle.tsx index 7bd58371d..3547f2be4 100644 --- a/packages/frontend/src/view/pages/home/components/HomeSpotlightArticle.tsx +++ b/packages/frontend/src/view/pages/home/components/HomeSpotlightArticle.tsx @@ -25,9 +25,7 @@ export function HomeSpotlightArticle(props: HomeSpotlightArticleProps) { Read now

- + ) } diff --git a/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx b/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx index 85244a8c4..e293141fb 100644 --- a/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx +++ b/packages/frontend/src/view/pages/home/components/HomeTutorials.tsx @@ -36,10 +36,7 @@ export function HomeTutorials(props: HomeTutorialsProps) { href={`/tutorials/${tutorial.slug}`} className="group flex w-full items-center gap-4" > - +

{tutorial.title}