diff --git a/docs/diagrams/contracts/capital.md b/docs/diagrams/contracts/capital.md index 73a4ef87b3..9672605e7c 100644 --- a/docs/diagrams/contracts/capital.md +++ b/docs/diagrams/contracts/capital.md @@ -13,11 +13,11 @@ graph TD MCR["MCR"] %% Swap Flow - Member -->|"(1a) swap"| Ramm - Ramm -->|"(1b) validate swap"| Pool - Ramm -->|"(1c) execute swap"| Pool - Pool -->|"(1d) update MCR"| MCR - Pool -.->|"(1e) transfer swapped assets"| Member + Member -->|"**(1a)** swap"| Ramm + Ramm -->|"**(1b)** validate swap"| Pool + Ramm -->|"**(1c)** execute swap"| Pool + Pool -->|"**(1d)** update MCR"| MCR + Pool -.->|"**(1e)** transfer swapped assets"| Member ``` ## Operator Flow @@ -33,15 +33,15 @@ graph TD CoW["CoW Settlement"] %% Swap Flow - Operator -->|"(1a) placeOrder"| SwapOp - SwapOp -->|"(1b) validatePreSwap"| Pool - SwapOp -->|"(1c) transferAsset"| Pool - SwapOp -->|"(1d) sign & submit CoW Swap order"| CoW - CoW -.->|"(1e) execute swap & return assets"| SwapOp + Operator -->|"**(1a)** placeOrder"| SwapOp + SwapOp -->|"**(1b)** validatePreSwap"| Pool + SwapOp -->|"**(1c)** transferAsset"| Pool + SwapOp -->|"**(1d)** sign & submit CoW Swap order"| CoW + CoW -.->|"**(1e)** execute swap & return assets"| SwapOp %% Close Order Flow - Operator -->|"(2a) closeOrder"| SwapOp - SwapOp -->|"(2b) return assets"| Pool + Operator -->|"**(2a)** closeOrder"| SwapOp + SwapOp -->|"**(2b)** return assets"| Pool ``` ## Actions @@ -55,32 +55,32 @@ graph TD ### 1. Member Actions 1. **Swap NXM/ETH** - - (1a) **Member** calls `swap` on RAMM - - (1b) **RAMM** validates swap conditions: + - **(1a)** `Member` calls `swap` on RAMM + - **(1b)** `RAMM` validates swap conditions: - System not paused - Swap not paused - Valid deadline - - (1c) **RAMM** executes swap with Pool - - (1d) **Pool** triggers MCR update - - (1e) **Pool** transfers swapped assets to member + - **(1c)** `RAMM` executes swap with Pool + - **(1d)** `Pool` triggers MCR update + - **(1e)** `Pool` transfers swapped assets to member ### 2. Operator Actions 1. **Place Order** - - (1a) **Operator** calls `placeOrder` on SwapOperator - - (1b) **SwapOperator** validates pre-swap conditions: + - **(1a)** `Operator` calls `placeOrder` on SwapOperator + - **(1b)** `SwapOperator` validates pre-swap conditions: - Token enabled status - Balance limits - Swap frequency - Max fee and slippage - - (1c) **SwapOperator** transfers assets from Pool - - (1d) **SwapOperator** signs and submits CoW swap order - - (1e) **CoW Settlement** executes swap and returns assets to SwapOperator + - **(1c)** `SwapOperator` transfers assets from Pool + - **(1d)** `SwapOperator` signs and submits CoW swap order + - **(1e)** `CoW Settlement` executes swap and returns assets to SwapOperator 2. **Close Order** - - (2a) **Operator** calls `closeOrder` on SwapOperator - - (2b) **SwapOperator** returns assets to Pool + - **(2a)** `Operator` calls `closeOrder` on SwapOperator + - **(2b)** `SwapOperator` returns assets to Pool ## Notes diff --git a/docs/diagrams/contracts/claims-assessment.md b/docs/diagrams/contracts/claims-assessment.md deleted file mode 100644 index 57865ff653..0000000000 --- a/docs/diagrams/contracts/claims-assessment.md +++ /dev/null @@ -1,123 +0,0 @@ -# Claims & Assessment - -## 1. Submit Claim Flow - -```mermaid -graph TD - %% Users - Member(("Cover Buyer")) - - %% Contracts - IndividualClaims["IndividualClaims Contract"] - Assessment["Assessment Contract"] - Cover["Cover Contract"] - CoverNFT["CoverNFT Contract"] - - %% Submit Claim - Member -->|"(1a) submitClaim"| IndividualClaims - IndividualClaims -->|"(1b) validate cover"| CoverNFT - IndividualClaims -->|"(1c) validate amount"| Cover - IndividualClaims -->|"(1d) startAssessment"| Assessment -``` - -## 2. Assessment & Redemption Flow - -```mermaid -graph TD - %% Users - Member(("Cover Buyer")) - Assessor(("Claim Assessor")) - - %% Contracts - IndividualClaims["IndividualClaims Contract"] - Assessment["Assessment Contract"] - Cover["Cover Contract"] - TokenController["TokenController"] - Pool["Pool"] - - %% Assessment Process - Assessor -->|"(2a) castVotes"| Assessment - Assessment -->|"(2b) lock staked NXM"| TokenController - - %% Claim Payout - Member -->|"(3a) redeemClaimPayout"| IndividualClaims - IndividualClaims -->|"(3b) validate claim status"| Assessment - IndividualClaims -->|"(3c) burnStake"| Cover - IndividualClaims -->|"(3d) sendPayout"| Pool - Pool -.->|"(3e) transfer claim amount + deposit"| Member -``` - -## Actions - -### Quick Summary: - -1. Cover buyers can submit claims and redeem payouts -2. Claim assessors vote on claim validity -3. Approved claims receive payouts in cover asset - -### 1. Cover Buyer Actions - -1. **Submit Claim** - - - Call `submitClaim` on IndividualClaims to request a payout - - Provide: - - Cover ID - - Claim amount - - Incident date - - Proof of loss - - Pay claim assessment deposit in ETH - -2. **Redeem Approved Claim** - - Wait for assessment period to complete - - If claim is approved, call `redeemClaimPayout` on IndividualClaims - - Receive: - - Claim amount in cover asset - - Assessment deposit returned in ETH - -### 2. Claim Assessor Actions - -1. **Vote on Claims** - - Call `castVotes` on Assessment contract - - Specify: - - Claim ID - - Vote (Accept/Reject) - - Stake amount - - NXM stake is locked during voting period - ---- - -## Claim Submission & Processing - -1. **Submit Claim** - (1a) **Cover Buyer** calls `submitClaim` on IndividualClaims - (1b) **IndividualClaims** validates cover ownership via CoverNFT - (1c) **IndividualClaims** validates claim amount via Cover - (1d) **IndividualClaims** starts assessment process - -2. **Assessment Process** - (2a) **Assessors** call `castVotes` on Assessment - (2b) **Assessment** locks staked NXM via TokenController for voting period - -3. **Claim Payout** - (3a) **Cover Buyer** calls `redeemClaimPayout` on IndividualClaims - (3b) **IndividualClaims** validates with Assessment: - - - Assessment period has ended - - More accept votes than deny votes - - Cooldown period has passed - - (3c) **IndividualClaims** calls Cover to burn stake from affected pools - (3d) **IndividualClaims** sends payout via Pool - (3e) **Pool** transfers: - - - Claim amount in cover asset - - Returns assessment deposit in ETH - -## Notes - -- Claims can be submitted before the grace period ends (cover expiry + grace period days) -- Assessment period has a fixed duration for voting -- Claimant deposits ETH when submitting a claim: - - Deposit is returned to claimant if claim is approved - - Deposit is distributed to assessors if claim is rejected -- Approved claims burn staked NXM from affected staking pools diff --git a/docs/diagrams/contracts/claims-assessments.md b/docs/diagrams/contracts/claims-assessments.md new file mode 100644 index 0000000000..4bbab9664a --- /dev/null +++ b/docs/diagrams/contracts/claims-assessments.md @@ -0,0 +1,142 @@ +# Claims & Assessments + +## 1. Submit Claim Flow + +```mermaid +graph TD + %% Users + Member(("Cover Buyer")) + + %% Contracts + Claims["Claims Contract"] + Assessments["Assessments Contract"] + Cover["Cover Contract"] + CoverNFT["CoverNFT Contract"] + Pool["Pool Contract"] + + %% Submit Claim + Member -->|"**(1a)** submitClaim + deposit"| Claims + Claims -->|"**(1b)** validate cover ownership"| CoverNFT + Claims -->|"**(1c)** validate cover data"| Cover + Claims -->|"**(1d)** transfer deposit"| Pool + Claims -->|"**(1e)** startAssessment"| Assessments +``` + +## 2. Assessment Voting Flow + +```mermaid +graph TD + %% Users + Assessor(("Assessor")) + + %% Contracts + Assessments["Assessments Contract"] + + %% Assessment Process + Assessor -->|"**(2a)** castVote"| Assessments + Assessments -->|"**(2b)** record vote in assessing group"| Assessments +``` + +- **Voting Period**: 3 days from claim submission +- **Cooldown Period**: starts after voting ends (typically 24 hours - product dependent) +- See [Technical Notes](#technical-notes) for complete timing details + +## 3. Claim Payout Flow (Accepted) + +```mermaid +graph TD + %% Users + Member(("Cover Buyer")) + + %% Contracts + Claims["Claims Contract"] + Assessments["Assessments Contract"] + Cover["Cover Contract"] + Pool["Pool Contract"] + + %% Claim Payout + Member -->|"**(3a)** redeemClaimPayout"| Claims + Claims -->|"**(3b)** validate claim outcome"| Assessments + Claims -->|"**(3c)** burnStake"| Cover + Claims -->|"**(3d)** sendPayout"| Pool + Pool -.->|"**(3e)** transfer claim amount + deposit"| Member +``` + +- **Period Start**: Payout redemption period begins after the assessment cooldown period ends +- **Redemption Period**: Must be redeemed within the payout redemption period (typically 30 days - product dependent) +- See [Technical Notes](#technical-notes) for complete timing details + +## 4. Deposit Retrieval Flow (Draw) + +```mermaid +graph TD + %% Users + Member(("Cover Buyer")) + + %% Contracts + Claims["Claims Contract"] + Assessments["Assessments Contract"] + Pool["Pool Contract"] + + %% Deposit Retrieval + Member -->|"**(4a)** retrieveDeposit"| Claims + Claims -->|"**(4b)** validate outcome is DRAW"| Assessments + Claims -->|"**(4c)** sendPayout"| Pool + Pool -.->|"**(4d)** transfer deposit only"| Member +``` + +## Claim Submission & Processing + +### 1. Submit Claim + +**(1a)** `Cover Buyer` calls **submitClaim** on `Claims` contract with ETH deposit +**(1b)** `Claims` validates cover ownership via `CoverNFT` +**(1c)** `Claims` validates claim amount and cover validity via `Cover` +**(1d)** `Claims` transfers deposit to `Pool` +**(1e)** `Claims` starts assessment process via `Assessments` contract + +### 2. Assessment Process + +**(2a)** `Assessors` from the assigned assessing group call **castVote** on `Assessments` +**(2b)** `Assessments` records votes (accept/deny) for the claim + +### 3. Claim Payout (Accepted Outcome) + +**(3a)** `Cover Buyer` calls **redeemClaimPayout** on `Claims` +**(3b)** `Claims` validates with `Assessments`: + +- Voting period has ended (3 days) +- Assessment outcome is ACCEPTED (accept votes > deny votes) +- Assessment cooldown period has passed (starts after voting ends, typically 24 hours) +- Must be within payout redemption period (starts after cooldown ends, typically 30 days) + +**(3c)** `Claims` calls `Cover` to burn stake from affected staking pools +**(3d)** `Claims` requests payout from `Pool` +**(3e)** `Pool` transfers: + +- Claim amount in cover asset +- Assessment deposit in ETH + +### 4. Deposit Retrieval (Draw Outcome) + +**(4a)** `Cover Buyer` calls **retrieveDeposit** on `Claims` +**(4b)** `Claims` validates with `Assessments` that outcome is DRAW (accept votes = deny votes) +**(4c)** `Claims` requests deposit from `Pool` +**(4d)** `Pool` transfers assessment deposit in ETH only + +## Assessment Outcomes + +- **ACCEPTED**: Accept votes > Deny votes → Claimant can redeem payout + deposit +- **DENIED**: Deny votes > Accept votes → Deposit remains in Pool +- **DRAW**: Accept votes = Deny votes → Claimant can retrieve deposit and resubmit claim + +## Technical Notes + +- Claims can be submitted **before the grace period ends** (cover expiry + grace period) +- Claimant deposits ETH when submitting (**0.05 ETH**) +- **Assessment voting period**: 3 days from claim submission +- **Cooldown period**: Starts immediately after voting period ends (typically 24 hours, product-type dependent) +- **Payout redemption period**: Starts after cooldown ends (typically 30 days, product-type dependent) +- Assessors are part of assessing groups assigned per product type +- Not all assessors are required to vote; outcome determined by votes cast at voting period end +- Approved claims burn staked NXM from the staking pools that backed the cover diff --git a/docs/diagrams/contracts/cover.md b/docs/diagrams/contracts/cover.md index d3aedc0e64..e03301ad67 100644 --- a/docs/diagrams/contracts/cover.md +++ b/docs/diagrams/contracts/cover.md @@ -15,11 +15,11 @@ graph TD NXMaster["NXMaster Registry"] %% Member interactions - Member -->|"(1a) buyCover"| Cover - Cover -->|"(1b) validate product"| CoverProducts - Cover -->|"(1c) mint"| CoverNFT - CoverNFT -.->|"(1c) issues Cover NFT"| Member - Cover -->|"(1d) payment"| Pool + Member -->|"**(1a)** buyCover"| Cover + Cover -->|"**(1b)** validate product"| CoverProducts + Cover -->|"**(1c)** mint"| CoverNFT + CoverNFT -.->|"**(1c)** issues Cover NFT"| Member + Cover -->|"**(1d)** payment"| Pool %% Contract Registry interactions CoverProducts -.->|"getLatestAddress"| NXMaster @@ -40,9 +40,9 @@ graph TD Pool["Pool Contract"] %% AB Member interactions - ABMember -->|"(1) setProducts"| CoverProducts - ABMember -->|"(2) setProductTypes"| CoverProducts - ABMember -->|"(3) setProductsMetadata"| CoverProducts + ABMember -->|"**(1)** setProducts"| CoverProducts + ABMember -->|"**(2)** setProductTypes"| CoverProducts + ABMember -->|"**(3)** setProductsMetadata"| CoverProducts %% Internal validations CoverProducts -->|"validate assets"| Pool @@ -59,21 +59,21 @@ graph TD ### 1. Member Actions 1. **Buy Cover** - (1a) **Member** calls `buyCover` on Cover with: + **(1a)** `Member` calls `buyCover` on Cover with: - Product ID - Cover amount - Cover period - Payment asset - Cover asset - (1b) **Cover** validates product with CoverProducts - (1c) **Cover** mints NFT representing cover - - issues Cover NFT to buyer - (1d) **Cover** processes payment via Pool + **(1b)** `Cover` validates product with CoverProducts + **(1c)** `Cover` mints NFT representing cover + - issues Cover NFT to buyer + **(1d)** `Cover` processes payment via Pool ### 2. Advisory Board Actions 1. **Product Configuration** - (1) **AB Member** calls `setProducts` on CoverProducts to: + **(1)** `AB Member` calls `setProducts` on CoverProducts to: - Add new products (`productId = uint256.max`) - Update existing products @@ -81,14 +81,14 @@ graph TD - Set capacity reduction ratios - Configure allowed staking pools - (2) **AB Member** calls `setProductTypes` on CoverProducts to: + **(2)** `AB Member` calls `setProductTypes` on CoverProducts to: - Define product types (`productTypeId = uint256.max`) - Set grace periods - Set product type names - Update product type metadata - (3) **AB Member** calls `setProductsMetadata` to: + **(3)** `AB Member` calls `setProductsMetadata` to: - Update product IPFS metadata - Update product type IPFS metadata diff --git a/docs/diagrams/contracts/governance-membership.md b/docs/diagrams/contracts/governance-membership.md deleted file mode 100644 index db14403e6e..0000000000 --- a/docs/diagrams/contracts/governance-membership.md +++ /dev/null @@ -1,135 +0,0 @@ -# Governance & Membership Contracts - -## 1. Member Flow - -```mermaid -graph TD - %% Users - Member(("Member")) - - %% Contracts - Governance["Governance Contract"] - VotePower["VotePower Contract"] - MemberRoles["MemberRoles Contract"] - NXMaster["NXMaster Registry"] - - %% Member interactions - Member -->|"(1) submitProposal"| Governance - Member -->|"(2) vote"| Governance - Member -->|"(3) queryVotingPower"| VotePower - Member -->|"(4) withdrawMembership"| MemberRoles - Member -->|"(5) switchMembership"| MemberRoles - - %% Contract Registry interactions - Governance -.->|"getLatestAddress"| NXMaster - VotePower -.->|"getLatestAddress"| NXMaster - MemberRoles -.->|"getLatestAddress"| NXMaster -``` - -## 2. Advisory Board Flow - -```mermaid -graph TD - %% Users - ABMember(("AB Member")) - - %% Contracts - Governance["Governance Contract"] - MemberRoles["MemberRoles Contract"] - NXMaster["NXMaster Registry"] - - %% AB Member interactions - ABMember -->|"(1) approveProposal"| Governance - ABMember -->|"(2) rejectAction"| Governance - ABMember -->|"(3) swapABMember"| MemberRoles - - %% Contract Registry interactions - Governance -.->|"getLatestAddress"| NXMaster - MemberRoles -.->|"getLatestAddress"| NXMaster -``` - -## Actions - -### Quick Summary: - -1. Members can submit and vote on proposals -2. AB Members review and approve proposals -3. Operators execute approved proposals - -### 1. Member Actions - -1. **Submit Proposal** - - - **Member** calls `submitProposal` on Governance with: - - Proposal title - - Short description - - Proposal description hash - - Category ID - -2. **Vote on Proposal** - - - **Member** calls `vote` on Governance with: - - Proposal ID - - Solution ID - - Include managed staking pools flag - -3. **Query Voting Power** - - - **Member** calls `queryVotingPower` on VotePower to: - - Check voting influence - - View delegated voting power - -4. **Withdraw Membership** - - - **Member** calls `withdrawMembership` on MemberRoles to: - - Remove membership status - - Burn remaining NXM tokens - -5. **Switch Membership** - - **Member** calls `switchMembership` on MemberRoles to: - - Transfer membership to new address - - Move NXM tokens and assets - -### 2. Advisory Board Actions - -1. **Approve Proposal** - - - **AB Member** calls `approveProposal` on Governance to: - - Move proposal to voting stage - - Set voting parameters - -2. **Reject Action** - - - **AB Member** calls `rejectAction` on Governance to: - - Block suspicious proposal execution - - Requires majority AB rejection - -3. **Swap AB Member** - - **AB Member** calls `swapABMember` on MemberRoles to: - - Replace existing AB member - - Update AB member registry - -### 3. Operator Actions - -1. **Execute Proposal** - - **Operator** calls `triggerAction` on Governance to: - - Execute approved proposals - - Must wait for action waiting time - - Handles proposal implementation - -## Notes - -- Proposals require minimum token holding time -- AB members can reject suspicious proposals -- Voting power includes delegated votes -- Members can delegate voting power -- Special resolutions have different majority requirements -- All contracts fetch latest addresses from NXMaster Registry - -## NXMMaster Registry Dependencies - -All contracts fetch latest contract addresses from NXMaster: - -- **Governance:** TC (`TokenController`), MR (`MemberRoles`), PC (`ProposalCategory`) -- **MemberRoles:** TC (`TokenController`), P1 (`Pool`), CO (`Cover`), PS (`PooledStaking`), AS (`Assessment`) -- **VotePower:** TC (`TokenController`), MR (`MemberRoles`), GV (`Governance`) diff --git a/docs/diagrams/contracts/governor-registry.md b/docs/diagrams/contracts/governor-registry.md new file mode 100644 index 0000000000..32d33b9681 --- /dev/null +++ b/docs/diagrams/contracts/governor-registry.md @@ -0,0 +1,129 @@ +# Governor & Registry Contracts + +## 1. Member Proposal Flow + +```mermaid +graph TD + %% Users + Member(("Member")) + + %% Contracts + Governor["Governor Contract"] + Registry["Registry Contract"] + TokenController["TokenController Contract"] + + %% Member Proposal Flow + Member -->|"**(1a)** proposeAdvisoryBoardSwap"| Governor + Governor -->|"**(1b)** validate member & voting weight"| Registry + Governor -->|"**(1c)** create member proposal"| Governor + + %% Member Voting Flow + Member -->|"**(2a)** vote on proposal"| Governor + Governor -->|"**(2b)** calculate vote weight"| TokenController + Governor -->|"**(2c)** lock tokens until execution"| TokenController + + %% Member Execution Flow + Member -->|"**(3a)** execute + (after timelock)"| Governor + Governor -->|"**(3b)** validate quorum & outcome"| Governor + Governor -->|"**(3c)** swap AB members"| Registry +``` + +- **Proposal Threshold**: Minimum 100 NXM tokens required to propose AB swaps +- **Vote Weight**: Based on total NXM balance, capped at 5% of total supply +- **Token Locking**: Member tokens locked during voting until proposal execution deadline +- See [Technical Notes](#technical-notes) for timing and quorum details + +## 2. Advisory Board Proposal Flow + +```mermaid +graph TD + %% Users + ABMember(("AB Member")) + + %% Contracts + Governor["Governor Contract"] + Registry["Registry Contract"] + + %% AB Proposal Flow + ABMember -->|"**(1a)** propose + (arbitrary actions)"| Governor + Governor -->|"**(1b)** validate + AB membership"| Registry + Governor -->|"**(1c)** create AB proposal"| Governor + + %% AB Voting Flow + ABMember -->|"**(2a)** vote on proposal"| Governor + Governor -->|"**(2b)** record AB vote (weight = 1)"| Governor + + %% AB Execution Flow + ABMember -->|"**(3a)** execute + (after timelock)"| Governor + Governor -->|"**(3b)** validate threshold (≥3 votes)"| Governor + Governor -->|"**(3c)** execute arbitrary actions"| Governor +``` + +- **Proposal Content**: AB members can propose arbitrary system actions +- **Vote Weight**: Each AB member has equal vote weight of 1 +- **Threshold**: Requires ≥3 supporting AB votes to pass +- See [Technical Notes](#technical-notes) for timing details + +## Governance Flow Summary + +### 1. Member Proposal Process + +**(1a)** `Member` calls **proposeAdvisoryBoardSwap** on `Governor` with AB member swaps
+**(1b)** `Governor` validates member status and voting weight (≥100 NXM) via `Registry`
+**(1c)** `Governor` creates member proposal with 3-day voting period
+ +**(2a)** `Members` call **vote** on `Governor` during voting period
+**(2b)** `Governor` calculates vote weight via `TokenController` (NXM balance + 1, capped at 5%)
+**(2c)** `Governor` locks member tokens via `TokenController` until execution deadline
+ +**(3a)** `Member` calls **execute** on `Governor` after timelock period
+**(3b)** `Governor` validates quorum (≥15% participation) and outcome (for > against)
+**(3c)** `Governor` executes AB member swaps via `Registry`
+ +### 2. Advisory Board Proposal Process + +**(1a)** `AB Member` calls **propose** on `Governor` with arbitrary transactions
+**(1b)** `Governor` validates AB membership via Registry
+**(1c)** `Governor` creates AB proposal with 3-day voting period
+ +**(2a)** `AB Members` call **vote** on `Governor` during voting period
+**(2b)** `Governor` records AB votes with weight of 1 each
+ +**(3a)** `AB Member` calls **execute** on `Governor` after timelock period
+**(3b)** `Governor` validates threshold (≥3 supporting votes) and outcome
+**(3c)** `Governor` executes arbitrary transactions
+ +## Proposal Outcomes + +- **PASSED**: For votes > Against votes AND meets threshold/quorum requirements +- **FAILED**: Against votes ≥ For votes OR doesn't meet threshold/quorum requirements + +## Technical Notes + +### Proposal Timeline +- **Voting Period**: 3 days from proposal creation +- **Timelock Period**: 1 day after voting ends before execution allowed +- **Early Closure**: AB proposals automatically close voting when ≥3 votes received + +### Member Proposals +- **Proposal Threshold**: ≥100 NXM tokens required to create proposal +- **Vote Weight**: `totalBalanceOf(voter) + 1 NXM`, capped at 5% of total supply +- **Quorum**: ≥15% of total NXM supply must participate in voting +- **Token Locking**: Member tokens locked from vote time until execution deadline +- **Scope**: Limited to Advisory Board member swaps only + +### Advisory Board Proposals +- **Proposal Content**: Can contain arbitrary system actions/transactions +- **Vote Weight**: Each AB member has equal weight of 1 +- **Threshold**: ≥3 supporting votes required to pass +- **No Token Locking**: AB members don't lock tokens when voting + +### Registry Dependencies + +Governor contract fetches addresses from Registry for: +- **TokenController**: For vote weight calculation and token locking +- **Registry**: For member validation and AB member management \ No newline at end of file diff --git a/docs/diagrams/contracts/staking.md b/docs/diagrams/contracts/staking.md index e39b36cb35..69103da07f 100644 --- a/docs/diagrams/contracts/staking.md +++ b/docs/diagrams/contracts/staking.md @@ -18,17 +18,17 @@ graph TD end %% Staker interactions - Staker -->|"(1a) depositTo()"| StakingPool - StakingPool -->|"(1b) mint()"| StakingNFT - StakingNFT -.->|"(1c) issues NFT"| Staker + Staker -->|"**(1a)** depositTo()"| StakingPool + StakingPool -->|"**(1b)** mint()"| StakingNFT + StakingNFT -.->|"**(1c)** issues NFT"| Staker - Staker -->|"(2a) withdraw()"| StakingPool - StakingPool -->|"(2b) burn()"| StakingNFT - StakingPool -->|"(2c) withdrawNXMStakeAndRewards()"| TCO - TCO -->|"(2d) transfer()"| NXM - NXM -.->|"(2e) returns NXM + rewards"| Staker + Staker -->|"**(2a)** withdraw()"| StakingPool + StakingPool -->|"**(2b)** burn()"| StakingNFT + StakingPool -->|"**(2c)** withdrawNXMStakeAndRewards()"| TCO + TCO -->|"**(2d)** transfer()"| NXM + NXM -.->|"**(2e)** returns NXM + rewards"| Staker - Staker -->|"(3) extendDeposit()"| StakingPool + Staker -->|"**(3)** extendDeposit()"| StakingPool %% Contract Registry interactions StakingPool -.->|"getLatestAddress"| NXMaster @@ -48,12 +48,12 @@ graph TD NXMaster["NXMaster Registry"] %% Manager interactions - Manager -->|"(1a) createStakingPool()"| StakingProducts - Manager -->|"(2) setProducts()"| StakingProducts - Manager -->|"(3) setPoolMetadata()"| StakingProducts + Manager -->|"**(1a)** createStakingPool()"| StakingProducts + Manager -->|"**(2)** setProducts()"| StakingProducts + Manager -->|"**(3)** setPoolMetadata()"| StakingProducts %% Internal interactions - StakingProducts -->|"(1b) create"| StakingPoolFactory + StakingProducts -->|"**(1b)** create"| StakingPoolFactory %% Contract Registry interactions StakingProducts -.->|"getLatestAddress"| NXMaster @@ -71,27 +71,27 @@ graph TD ### 1. Staker Actions 1. **Deposit Stake** - (1a) **Staker** calls `depositTo()` on StakingPool with: + **(1a)** `Staker` calls `depositTo()` on StakingPool with: - Amount of NXM to stake - Target tranche ID - Optional existing NFT ID - (1b) **StakingPool** calls `mint()` on StakingNFT - (1c) **StakingNFT** issues NFT to staker + **(1b)** `StakingPool` calls `mint()` on StakingNFT + **(1c)** `StakingNFT` issues NFT to staker 2. **Withdraw Stake** - (2a) **Staker** calls `withdraw()` on StakingPool with: + **(2a)** `Staker` calls `withdraw()` on StakingPool with: - NFT ID - Tranche IDs - Amount to withdraw - (2b) **StakingPool** calls `burn()` on StakingNFT - (2c) **StakingPool** calls `withdrawNXMStakeAndRewards()` on TokenController - (2d) **TokenController** calls `transfer()` on NXMToken - (2e) **NXMToken** returns NXM + rewards to staker + **(2b)** `StakingPool` calls `burn()` on StakingNFT + **(2c)** `StakingPool` calls `withdrawNXMStakeAndRewards()` on TokenController + **(2d)** `TokenController` calls `transfer()` on NXMToken + **(2e)** `NXMToken` returns NXM + rewards to staker 3. **Extend Deposit** - (3) **Staker** calls `extendDeposit()` on StakingPool with: + **(3)** `Staker` calls `extendDeposit()` on StakingPool with: - NFT ID - Source tranche ID - Target tranche ID @@ -100,23 +100,23 @@ graph TD ### 2. Staking Pool Manager Actions 1. **Create Pool** - (1a) **Manager** calls `createStakingPool()` on StakingProducts with: + **(1a)** `Manager` calls `createStakingPool()` on StakingProducts with: - Pool privacy setting - Initial and max pool fees - Product initialization parameters - IPFS metadata hash - (1b) **StakingProducts** calls `create()` on StakingPoolFactory + **(1b)** `StakingProducts` calls `create()` on StakingPoolFactory 2. **Configure Products** - (2) **Manager** calls `setProducts()` on StakingProducts with: + **(2)** `Manager` calls `setProducts()` on StakingProducts with: - Product IDs - Target weights - Target price 3. **Update Metadata** - (3) **Manager** calls `setPoolMetadata()` on StakingProducts with: + **(3)** `Manager` calls `setPoolMetadata()` on StakingProducts with: - Pool ID - New IPFS metadata hash diff --git a/docs/diagrams/contracts/token.md b/docs/diagrams/contracts/token.md index 5a4214b677..728463335c 100644 --- a/docs/diagrams/contracts/token.md +++ b/docs/diagrams/contracts/token.md @@ -13,13 +13,13 @@ graph TD NXMaster["NXMaster Registry"] %% Member interactions - Member -->|"(1) transfer()"| NXMToken - Member -->|"(2a) approve()"| NXMToken - Member -->|"(2b) increaseAllowance()"| NXMToken - Member -->|"(2c) decreaseAllowance()"| NXMToken - Member -->|"(3a) withdrawNXM()"| TokenController - TokenController -->|"(3b) transfer()"| NXMToken - NXMToken -.->|"(3c) sends NXM"| Member + Member -->|"**(1)** transfer()"| NXMToken + Member -->|"**(2a)** approve()"| NXMToken + Member -->|"**(2b)** increaseAllowance()"| NXMToken + Member -->|"**(2c)** decreaseAllowance()"| NXMToken + Member -->|"**(3a)** withdrawNXM()"| TokenController + TokenController -->|"**(3b)** transfer()"| NXMToken + NXMToken -.->|"**(3c)** sends NXM"| Member %% Contract Registry interactions NXMToken -.->|"getLatestAddress"| NXMaster @@ -39,11 +39,11 @@ graph TD NXMaster["NXMaster Registry"] %% Operator interactions - Operator -->|"(1a) mint()"| TokenController - TokenController -->|"(1b) mint()"| NXMToken - Operator -->|"(2a) operatorTransfer()"| TokenController - TokenController -->|"(2b) operatorTransfer()"| NXMToken - NXMToken -.->|"(2c) sends NXM"| TokenController + Operator -->|"**(1a)** mint()"| TokenController + TokenController -->|"**(1b)** mint()"| NXMToken + Operator -->|"**(2a)** operatorTransfer()"| TokenController + TokenController -->|"**(2b)** operatorTransfer()"| NXMToken + NXMToken -.->|"**(2c)** sends NXM"| TokenController %% Contract Registry interactions TokenController -.->|"getLatestAddress"| NXMaster diff --git a/docs/diagrams/nexus-mutual.md b/docs/diagrams/nexus-mutual.md index 0575876a48..a064d74e53 100644 --- a/docs/diagrams/nexus-mutual.md +++ b/docs/diagrams/nexus-mutual.md @@ -1,4 +1,4 @@ -# Nexus Mutual Platform Flow Diagram +## Nexus Mutual Platform Flow Diagram This document merges multiple **Cover** and **Staking** flows with their underlying interactions across **Token**, **Capital**, **Claims/Assessment**, and **Governance** groupings. We use two comprehensive flows: @@ -45,66 +45,76 @@ flowchart LR MR("MemberRoles") end + subgraph "Claims/Assessment Group" + IndClaims("IndividualClaims") + Assess("Assessment") + Assessor("Assessor") + end + %% 1. Buy Cover (single tx) - Buyer -->|"(1a) buyCover()"| CoverC - CoverC -->|"(1b) onlyMember check"| MR - CoverC -->|"(1c) get product info"| CoverP - CoverC -->|"(1d) mint Cover NFT"| CoverN - CoverN -->|"(1e) issue NFT"| Buyer - CoverC -->|"(1f) request allocations"| SP - CoverC -->|"(1g) handle payment"| TC - TC -->|"(1g) burn NXM or transfer ETH/ERC20"| PoolC + Buyer -->|"**(1a)** buyCover()"| CoverC + CoverC -->|"**(1b)** onlyMember check"| MR + CoverC -->|"**(1c)** get product info"| CoverP + CoverC -->|"**(1d)** mint Cover NFT"| CoverN + CoverN -->|"**(1e)** issue NFT"| Buyer + CoverC -->|"**(1f)** request allocations"| SP + CoverC -->|"**(1g)** handle payment"| TC + TC -->|"**(1g)** burn NXM or transfer ETH/ERC20"| PoolC %% 2. Submit Claim (single tx) - Buyer -->|"(2a) submitClaim()"| IndClaims - IndClaims -->|"(2b) validate isApprovedOrOwner()"| CoverN - IndClaims -->|"(2b) validate amount"| CoverC - IndClaims -->|"(2c) startAssessment()"| Assess + Buyer -->|"**(2a)** submitClaim()"| IndClaims + IndClaims -->|"**(2b)** validate isApprovedOrOwner()"| CoverN + IndClaims -->|"**(2b)** validate amount"| CoverC + IndClaims -->|"**(2c)** startAssessment()"| Assess %% 3. Assessment Process (multiple tx) - Assessor -->|"(3a) castVotes()"| Assess - Assess -->|"(3b) lock staked NXM"| TC - TC -->|"(3b) lock"| NXM + Assessor -->|"**(3a)** castVotes()"| Assess + Assess -->|"**(3b)** lock staked NXM"| TC + TC -->|"**(3b)** lock"| NXM %% 4. Claim Payout (single tx) - Buyer -->|"(4a) redeemClaimPayout()"| IndClaims - IndClaims -->|"(4b) burnStake()"| CoverC - IndClaims -->|"(4c) sendPayout()"| PoolC - PoolC -->|"(4c) transfer claim amount + deposit"| Buyer + Buyer -->|"**(4a)** redeemClaimPayout()"| IndClaims + IndClaims -->|"**(4b)** burnStake()"| CoverC + IndClaims -->|"**(4c)** sendPayout()"| PoolC + PoolC -->|"**(4c)** transfer claim amount + deposit"| Buyer ``` ### Step-by-Step -1. **Buyer Purchases Cover** - (1a) **Buyer** calls `buyCover(params, poolAllocationRequests)` on **Cover**. - (1b) **Cover** checks if buyer is a member via `onlyMember` modifier. - (1c) **Cover** gets product info from **CoverProducts**. - (1d) **Cover** mints NFT via **CoverNFT** if new cover. - (1e) **CoverNFT** issues NFT to buyer. - (1f) **Cover** requests allocations from **StakingPool**(s). - (1g) **Cover** handles payment: - For NXM: Burns premium via **TokenController** - For ETH/ERC20: Transfers premium to **Pool** - -2. **Buyer Submits Claim** - (2a) **Buyer** calls `submitClaim()` on **IndividualClaims**. - (2b) **IndividualClaims** validates: +1. **Buyer Purchases Cover**
+ **(1a)** `Buyer` calls `buyCover(params, poolAllocationRequests)` on **Cover**.
+ **(1b)** `Cover` checks if buyer is a member via `onlyMember` modifier.
+ **(1c)** `Cover` gets product info from **CoverProducts**.
+ **(1d)** `Cover` mints NFT via **CoverNFT** if new cover.
+ **(1e)** `CoverNFT` issues NFT to buyer.
+ **(1f)** `Cover` requests allocations from **StakingPool**(s).
+ **(1g)** `Cover` handles payment:
+ - For NXM: Burns premium via **TokenController**
+ - For ETH/ERC20: Transfers premium to **Pool** + +2. **Buyer Submits Claim**
+ **(2a)** `Buyer` calls `submitClaim()` on **IndividualClaims**.
+ **(2b)** `IndividualClaims` validates: - Cover ownership via `CoverNFT.isApprovedOrOwner()` - Cover validity via `Cover.coverSegmentWithRemainingAmount()` - (2c) **IndividualClaims** starts assessment via `Assessment.startAssessment()`. + **(2c)** `IndividualClaims` starts assessment via `Assessment.startAssessment()`.
-3. **Claim Assessment** - (3a) **Assessors** call `castVotes()" on **Assessment**. - (3b) **Assessment** locks staked NXM via **TokenController**. - (3c) When voting ends: +3. **Claim Assessment**
+ **(3a)** `Assessors` call `castVotes()` on **Assessment**.
+ **(3b)** `Assessment` locks staked NXM via **TokenController**.
+ **(3c)** When voting ends:
- - If accepted: Claim can be redeemed - - If denied: Claim deposit funds rewards + - If accepted: Claim can be redeemed
+ - If denied: Claim deposit funds rewards
-4. **Claim Payout** - (4a) **Buyer** calls `redeemClaimPayout()` on **IndividualClaims**. - (4b) **IndividualClaims** calls `Cover.burnStake()` to burn staker's NXM. - (4c) **IndividualClaims** calls `Pool.sendPayout()` which: - Transfers claim amount in cover asset - Returns assessment deposit in ETH +4. **Claim Payout**
+ **(4a)** `Buyer` calls `redeemClaimPayout()` on **IndividualClaims**.
+ **(4b)** `IndividualClaims` calls `Cover.burnStake()` to burn staker's NXM.
+ **(4c)** `IndividualClaims` calls `Pool.sendPayout()` which:
+ - Transfers claim amount in cover asset
+ - Returns assessment deposit in ETH --- @@ -143,71 +153,67 @@ flowchart LR end %% 1. Create Pool (single tx) - Manager -->|"(1a) createStakingPool()"| SPd - SPd -->|"(1b) create()"| SPF - SPF -->|"(1c) deploys"| SP - SPd -->|"(1d) assignManager"| TCO - SPd -->|"(1e) setInitialProducts"| SP + Manager -->|"**(1a)** createStakingPool()"| SPd + SPd -->|"**(1b)** create()"| SPF + SPF -->|"**(1c)** deploys"| SP + SPd -->|"**(1d)** assignManager"| TCO + SPd -->|"**(1e)** setInitialProducts"| SP %% 2. Update Products (single tx) - Manager -->|"(2a) setProducts()"| SPd - SPd -->|"(2b) updates weights & prices"| SP + Manager -->|"**(2a)** setProducts()"| SPd + SPd -->|"**(2b)** updates weights & prices"| SP %% 3. Deposit NXM (single tx) - Staker -->|"(3a) depositTo()"| SP - SP -->|"(3b) depositStakedNXM()"| TCO - TCO -->|"(3c) operatorTransfer()"| NXM + Staker -->|"**(3a)** depositTo()"| SP + SP -->|"**(3b)** depositStakedNXM()"| TCO + TCO -->|"**(3c)** operatorTransfer()"| NXM %% 4. Withdraw (single tx) - Staker -->|"(4a) withdraw()"| SP - SP -->|"(4b) withdrawNXMStakeAndRewards()"| TCO - TCO -->|"(4c) transfer"| NXM - TCO -->|"(4d) transfer stake + rewards"| Staker + Staker -->|"**(4a)** withdraw()"| SP + SP -->|"**(4b)** withdrawNXMStakeAndRewards()"| TCO + TCO -->|"**(4c)** transfer"| NXM + TCO -->|"**(4d)** transfer stake + rewards"| Staker %% 5. Burn and Payout on Claim (single tx) - Claimant -->|"(5a) redeemClaimPayout()"| IC - IC -->|"(5b) burnStake()"| CoverC - CoverC -->|"(5c) burnStake()"| SP - SP -->|"(5d) burnStakedNXM()"| TCO - TCO -->|"(5e) burn()"| NXM - IC -->|"(5f) sendPayout()"| PoolC - PoolC -->|"(5f) transfer claim amount + deposit"| Claimant + Claimant -->|"**(5a)** redeemClaimPayout()"| IC + IC -->|"**(5b)** burnStake()"| CoverC + CoverC -->|"**(5c)** burnStake()"| SP + SP -->|"**(5d)** burnStakedNXM()"| TCO + TCO -->|"**(5e)** burn()"| NXM + IC -->|"**(5f)** sendPayout()"| PoolC + PoolC -->|"**(5f)** transfer claim amount + deposit"| Claimant ``` ### Step-by-Step -1. **Pool Manager Creates a New Staking Pool** - (1a) **Manager** calls `"createStakingPool()"` on **StakingProducts**. - (1b) **StakingProducts** calls `"create()"` on **StakingPoolFactory**. - (1c) **StakingPoolFactory** deploys new **StakingPool**. - (1d) **StakingProducts** assigns manager via **TokenController**. - (1e) **StakingProducts** sets initial products and metadata. -
-2. **Manager Updates Pool Products** - (2a) **Manager** calls `"setProducts()"` on **StakingProducts**. - (2b) **StakingProducts** updates weights and prices in **StakingPool**. -
-3. **Staker Deposits NXM** - (3a) **Staker** calls `"depositTo(amount, trancheId, tokenId, dest)"` on **StakingPool**. - (3b) **StakingPool** validates and calculates shares, calls `"depositStakedNXM()"` on **TokenController**. - (3c) **TokenController** updates pool balance and calls `"operatorTransfer()"` on **NXMToken**. -
-4. **Staker Withdraws Stake/Rewards** - (4a) **Staker** calls `"withdraw()"` on **StakingPool**. - - - _Optional_: Check withdrawable amounts first via **NexusViewer** (`"getClaimableNXM()"`, `"getStakedNXM()"`) - - (4b) **StakingPool** calculates amounts, calls `"withdrawNXMStakeAndRewards()"` on **TokenController**. - (4c) **TokenController** calls transfers on **NXMToken**. - (4d) **NXMToken** transfer stake + rewards to **Staker** -
-5. **Claim Redemption Burns Stake and Pays Claimant** - If a claim is approved the claimant is paid from the staked NXM. - (5a) **Claimant** calls `"redeemClaimPayout()"` on **IndividualClaims**. - (5b) **IndividualClaims** calls `"burnStake()"` on **Cover**. - (5c) **Cover** calls `"burnStake()"` on affected **StakingPool**(s). - (5d) **StakingPool** calls `"burnStakedNXM()"` on **TokenController**. - (5e) **TokenController** burns tokens via **NXMToken**. - (5f) **IndividualClaims** calls `"Pool.sendPayout()"` which: - - Transfers claim amount in cover asset +1. **Pool Manager Creates a New Staking Pool**
+ **(1a)** `Manager` calls `"createStakingPool()"` on **StakingProducts**.
+ **(1b)** `StakingProducts` calls `"create()"` on **StakingPoolFactory**.
+ **(1c)** `StakingPoolFactory` deploys new **StakingPool**.
+ **(1d)** `StakingProducts` assigns manager via **TokenController**.
+ **(1e)** `StakingProducts` sets initial products and metadata.
+2. **Manager Updates Pool Products**
+ **(2a)** `Manager` calls `"setProducts()"` on **StakingProducts**.
+ **(2b)** `StakingProducts` updates weights and prices in **StakingPool**.
+3. **Staker Deposits NXM**
+ **(3a)** `Staker` calls `"depositTo(amount, trancheId, tokenId, dest)"` on **StakingPool**.
+ **(3b)** `StakingPool` validates and calculates shares, calls `"depositStakedNXM()"` on **TokenController**.
+ **(3c)** `TokenController` updates pool balance and calls `"operatorTransfer()"` on **NXMToken**.
+4. **Staker Withdraws Stake/Rewards**
+ **(4a)** `Staker` calls `"withdraw()"` on **StakingPool**.
+ + - _Optional_: Check withdrawable amounts first via **NexusViewer** (`"getClaimableNXM()"`, `"getStakedNXM()"`)
+ + **(4b)** `StakingPool` calculates amounts, calls `"withdrawNXMStakeAndRewards()"` on **TokenController**.
+ **(4c)** `TokenController` calls transfers on **NXMToken**.
+ **(4d)** `NXMToken` transfer stake + rewards to **Staker**
+5. **Claim Redemption Burns Stake and Pays Claimant**
+ If a claim is approved the claimant is paid from the staked NXM.
+ **(5a)** `Claimant` calls `"redeemClaimPayout()"` on **IndividualClaims**.
+ **(5b)** `IndividualClaims` calls `"burnStake()"` on **Cover**.
+ **(5c)** `Cover` calls `"burnStake()"` on affected **StakingPool**(s).
+ **(5d)** `StakingPool` calls `"burnStakedNXM()"` on **TokenController**.
+ **(5e)** `TokenController` burns tokens via **NXMToken**.
+ **(5f)** `IndividualClaims` calls `"Pool.sendPayout()"` which:
+ - Transfers claim amount in cover asset
- Returns assessment deposit in ETH diff --git a/docs/diagrams/user-flows/cover-buyer.md b/docs/diagrams/user-flows/cover-buyer.md index cc9f5f4a58..217e4a9b9b 100644 --- a/docs/diagrams/user-flows/cover-buyer.md +++ b/docs/diagrams/user-flows/cover-buyer.md @@ -14,22 +14,23 @@ graph TD CoverNFT["CoverNFT Contract"] TokenController["TokenController"] Pool["Pool"] + MemberRoles["MemberRoles"] + StakingPool["StakingPool"] %% Getting a Cover Quote - Member -->|"(1a) Calls Cover Router API /quote"| CoverRouter - CoverRouter -.->|"(1b) Responds with pool allocation"| Member + Member -->|"**(1a)** Calls Cover Router API /quote"| CoverRouter + CoverRouter -.->|"**(1b)** Responds with pool allocation"| Member %% Buying Cover - Member -->|"(2a) Calls buyCover"| Cover - Cover -->|"(2b) onlyMember check"| MemberRoles - Cover -->|"(2c) get product info"| CoverProducts - Cover -->|"(2d) mint Cover NFT"| CoverNFT - CoverNFT -->|"(2e) issue NFT"| Member - Cover -->|"(2f) request allocations"| StakingPool - Cover -->|"(2g) handle payment"| TokenController - TokenController -->|"(2g) burn NXM or transfer ETH/ERC20"| Pool + Member -->|"**(2a)** Calls buyCover"| Cover + Cover -->|"**(2b)** onlyMember check"| MemberRoles + Cover -->|"**(2c)** get product info"| CoverProducts + Cover -->|"**(2d)** mint Cover NFT"| CoverNFT + CoverNFT -->|"**(2e)** issue NFT"| Member + Cover -->|"**(2f)** request allocations"| StakingPool + Cover -->|"**(2g)** handle payment"| TokenController + TokenController -->|"**(2g)** burn NXM or transfer ETH/ERC20"| Pool ``` - ## Claims Flow ```mermaid @@ -42,24 +43,25 @@ graph TD IndividualClaims["IndividualClaims Contract"] Assessment["Assessment Contract"] Cover["Cover Contract"] + CoverNFT["CoverNFT Contract"] TokenController["TokenController"] Pool["Pool"] %% Submit Claim - Member -->|"(1a) submitClaim"| IndividualClaims - IndividualClaims -->|"(1b) validate cover"| CoverNFT - IndividualClaims -->|"(1b) validate amount"| Cover - IndividualClaims -->|"(1c) startAssessment"| Assessment + Member -->|"**(1a)** submitClaim"| IndividualClaims + IndividualClaims -->|"**(1b)** validate cover"| CoverNFT + IndividualClaims -->|"**(1b)** validate amount"| Cover + IndividualClaims -->|"**(1c)** startAssessment"| Assessment %% Assessment Process - Assessors -->|"(2a) castVotes"| Assessment - Assessment -->|"(2b) lock staked NXM"| TokenController + Assessors -->|"**(2a)** castVotes"| Assessment + Assessment -->|"**(2b)** lock staked NXM"| TokenController %% Claim Payout - Member -->|"(3a) redeemClaimPayout"| IndividualClaims - IndividualClaims -->|"(3b) burnStake"| Cover - IndividualClaims -->|"(3c) sendPayout"| Pool - Pool -.->|"(3c) transfer claim amount + deposit"| Member + Member -->|"**(3a)** redeemClaimPayout"| IndividualClaims + IndividualClaims -->|"**(3b)** burnStake"| Cover + IndividualClaims -->|"**(3c)** sendPayout"| Pool + Pool -.->|"**(3c)** transfer claim amount + deposit"| Member ``` ## Cover Buyer Actions @@ -78,18 +80,18 @@ graph TD ## Getting a Cover Quote and Purchase -1. **Quote Process** - (1a) **Cover Buyer** calls Cover Router API `/quote` to fetch price and pool allocation - (1b) **Cover Router API** responds with recommended pool allocation - -2. **Cover Purchase** - (2a) **Cover Buyer** calls `buyCover` on Cover with pool allocation - (2b) **Cover** checks if buyer is a member - (2c) **Cover** gets product info from CoverProducts - (2d) **Cover** mints NFT via CoverNFT if new cover - (2e) **CoverNFT** issues NFT to buyer - (2f) **Cover** requests allocations from StakingPool(s) - (2g) **Cover** handles payment: +1. **Quote Process**
+ **(1a)** `Cover Buyer` calls Cover Router API `/quote` to fetch price and pool allocation
+ **(1b)** `Cover Router API` responds with recommended pool allocation
+ +2. **Cover Purchase**
+ **(2a)** `Cover Buyer` calls `buyCover` on Cover with pool allocation
+ **(2b)** `Cover` checks if buyer is a member
+ **(2c)** `Cover` gets product info from CoverProducts
+ **(2d)** `Cover` mints NFT via CoverNFT if new cover
+ **(2e)** `CoverNFT` issues NFT to buyer
+ **(2f)** `Cover` requests allocations from StakingPool(s)
+ **(2g)** `Cover` handles payment:
- For NXM: Burns premium via TokenController - For ETH/ERC20: Transfers premium to Pool @@ -97,21 +99,20 @@ graph TD ## Claim Submission & Processing -1. **Submit Claim** - (1a) **Cover Buyer** calls `submitClaim` on IndividualClaims - (1b) **IndividualClaims** validates: - +1. **Submit Claim**
+ **(1a)** `Cover Buyer` calls `submitClaim` on IndividualClaims
+ **(1b)** `IndividualClaims` validates:
- Cover ownership via CoverNFT - Cover validity via Cover - (1c) **IndividualClaims** starts assessment process + **(1c)** `IndividualClaims` starts assessment process -2. **Assessment Process** - (2a) **Assessors** call `castVotes` on Assessment - (2b) **Assessment** locks staked NXM for voting period +2. **Assessment Process**
+ **(2a)** `Assessors` call `castVotes` on Assessment
+ **(2b)** `Assessment` locks staked NXM for voting period
-3. **Claim Payout** - (3a) **Cover Buyer** calls `redeemClaimPayout` on IndividualClaims - (3b) **IndividualClaims** calls Cover to burn stake from affected pools - (3c) **IndividualClaims** sends payout via Pool which: +3. **Claim Payout**
+ **(3a)** `Cover Buyer` calls `redeemClaimPayout` on IndividualClaims
+ **(3b)** `IndividualClaims` calls Cover to burn stake from affected pools
+ **(3c)** `IndividualClaims` sends payout via Pool which:
- Transfers claim amount in cover asset - Returns claim deposit in ETH diff --git a/docs/diagrams/user-flows/staker.md b/docs/diagrams/user-flows/staker.md index 5aaf3b338d..51e27940f5 100644 --- a/docs/diagrams/user-flows/staker.md +++ b/docs/diagrams/user-flows/staker.md @@ -14,11 +14,11 @@ graph TD SNFT["StakingNFT Contract"] %% Deposit Flow - Staker -->|"(1a) depositTo()"| SP - SP -->|"(1b) depositStakedNXM()"| TCO - TCO -->|"(1c) operatorTransfer()"| NXM - SP -->|"(1d) mintStakeNFT()"| SNFT - SNFT -.->|"(1e) issue Staking NFT"| Staker + Staker -->|"**(1a)** depositTo()"| SP + SP -->|"**(1b)** depositStakedNXM()"| TCO + TCO -->|"**(1c)** operatorTransfer()"| NXM + SP -->|"**(1d)** mintStakeNFT()"| SNFT + SNFT -.->|"**(1e)** issue Staking NFT"| Staker ``` ## Withdraw Flow @@ -34,10 +34,10 @@ graph TD NXM["NXMToken Contract"] %% Withdraw Flow - Staker -->|"(1a) withdraw()"| SP - SP -->|"(1b) withdrawNXMStakeAndRewards()"| TCO - TCO -->|"(1c) transfer"| NXM - NXM -.->|"(1c) transfer stake + rewards"| Staker + Staker -->|"**(1a)** withdraw()"| SP + SP -->|"**(1b)** withdrawNXMStakeAndRewards()"| TCO + TCO -->|"**(1c)** transfer"| NXM + NXM -.->|"**(1c)** transfer stake + rewards"| Staker ``` ## Staker Actions @@ -62,16 +62,16 @@ graph TD ## Deposit Stake Flow -(1a) **Staker** calls `depositTo()` on **StakingPool**. -(1b) **StakingPool** validates and calculates shares, calls `depositStakedNXM()` on **TokenController**. -(1c) **TokenController** updates pool balance and transfers NXM via **NXMToken**. -(1d) **StakingPool** calls `mintStakeNFT()` on **StakingNFT**. -(1e) **StakingNFT** issues NFT to staker as proof of stake. +**(1a)** `Staker` calls `depositTo()` on **StakingPool**. +**(1b)** `StakingPool` validates and calculates shares, calls `depositStakedNXM()` on **TokenController**. +**(1c)** `TokenController` updates pool balance and transfers NXM via **NXMToken**. +**(1d)** `StakingPool` calls `mintStakeNFT()` on **StakingNFT**. +**(1e)** `StakingNFT` issues NFT to staker as proof of stake. --- ## Withdraw Stake Flow -(1a) **Staker** calls `withdraw()` on **StakingPool**. -(1b) **StakingPool** calculates amounts, calls `withdrawNXMStakeAndRewards()` on **TokenController**. -(1c) **TokenController** transfers stake and rewards to staker via **NXMToken**. +**(1a)** `Staker` calls `withdraw()` on **StakingPool**. +**(1b)** `StakingPool` calculates amounts, calls `withdrawNXMStakeAndRewards()` on **TokenController**. +**(1c)** `TokenController` transfers stake and rewards to staker via **NXMToken**. diff --git a/docs/diagrams/user-flows/staking-manager.md b/docs/diagrams/user-flows/staking-manager.md index 498ea449b2..8d3075c628 100644 --- a/docs/diagrams/user-flows/staking-manager.md +++ b/docs/diagrams/user-flows/staking-manager.md @@ -15,21 +15,21 @@ graph TD Cover["Cover"] %% 1. Create Pool - Manager -->|"(1a) createStakingPool()"| SPd - SPd -->|"(1b) create()"| SPF - SPF -->|"(1c) deploys"| SP - SPd -->|"(1d) assignManager"| TCO - SPd -->|"(1e) setInitialProducts"| SP + Manager -->|"**(1a)** createStakingPool()"| SPd + SPd -->|"**(1b)** create()"| SPF + SPF -->|"**(1c)** deploys"| SP + SPd -->|"**(1d)** assignManager"| TCO + SPd -->|"**(1e)** setInitialProducts"| SP %% 2. Update Products - Manager -->|"(2a) setProducts()"| SPd - SPd -->|"(2b) updates weights & prices"| SP + Manager -->|"**(2a)** setProducts()"| SPd + SPd -->|"**(2b)** updates weights & prices"| SP %% 3. Recalculate Weights - Manager -->|"(3a) recalculateEffectiveWeights()"| SPd - SPd -->|"(3b) get capacity ratios"| CP - SPd -->|"(3c) get global capacity"| Cover - SPd -->|"(3d) update effective weights"| SP + Manager -->|"**(3a)** recalculateEffectiveWeights()"| SPd + SPd -->|"**(3b)** get capacity ratios"| CP + SPd -->|"**(3c)** get global capacity"| Cover + SPd -->|"**(3d)** update effective weights"| SP ``` ## Staking Pool Manager Actions @@ -60,27 +60,27 @@ graph TD ## Staking Pool Creation Flow -(1a) **Pool Manager** calls `createStakingPool()` on **StakingProducts**. -(1b) **StakingProducts** calls `create()` on **StakingPoolFactory**. -(1c) **StakingPoolFactory** deploys new **StakingPool**. -(1d) **StakingProducts** assigns manager via **TokenController**. -(1e) **StakingProducts** sets initial products and metadata. +**(1a)** `Pool Manager` calls `createStakingPool()` on **StakingProducts**. +**(1b)** `StakingProducts` calls `create()` on **StakingPoolFactory**. +**(1c)** `StakingPoolFactory` deploys new **StakingPool**. +**(1d)** `StakingProducts` assigns manager via **TokenController**. +**(1e)** `StakingProducts` sets initial products and metadata. --- ## Update Staking Pool Products -(2a) **Pool Manager** calls `setProducts()` on **StakingProducts**. -(2b) **StakingProducts** updates weights and prices in **StakingPool**. +**(2a)** `Pool Manager` calls `setProducts()` on **StakingProducts**. +**(2b)** `StakingProducts` updates weights and prices in **StakingPool**. --- ## Recalculate Effective Weights -(3a) **Pool Manager** calls `recalculateEffectiveWeights()` on **StakingProducts**. -(3b) **StakingProducts** gets capacity reduction ratios from **CoverProducts**. -(3c) **StakingProducts** gets global capacity ratio from **Cover**. -(3d) **StakingProducts** updates effective weights based on: +**(3a)** `Pool Manager` calls `recalculateEffectiveWeights()` on **StakingProducts**. +**(3b)** `StakingProducts` gets capacity reduction ratios from **CoverProducts**. +**(3c)** `StakingProducts` gets global capacity ratio from **Cover**. +**(3d)** `StakingProducts` updates effective weights based on: - Active stake in pool - Global capacity constraints