<mxfile host="drawio.lan">
  <diagram id="megapool-states" name="Megapool States">
    <mxGraphModel dx="1785" dy="1731" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2400" pageHeight="1600" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="init_dot" parent="1" style="ellipse;html=1;fillColor=#000000;strokeColor=#000000;" value="" vertex="1">
          <mxGeometry height="26" width="26" x="70" y="830" as="geometry" />
        </mxCell>
        <mxCell id="uninit" parent="1" style="rounded=1;whiteSpace=wrap;html=1;arcSize=30;fillColor=#FFFFFF;strokeColor=#000000;fontSize=16;" value="Uninitialised" vertex="1">
          <mxGeometry height="64" width="180" x="200" y="811" as="geometry" />
        </mxCell>
        <mxCell id="initialised" parent="1" style="rounded=1;whiteSpace=wrap;html=1;arcSize=20;fillColor=#FFFFFF;strokeColor=#000000;fontSize=16;" value="Initialised" vertex="1">
          <mxGeometry height="74" width="300" x="640" y="806" as="geometry" />
        </mxCell>
        <mxCell id="locked" parent="1" style="rounded=1;whiteSpace=wrap;html=1;arcSize=30;fillColor=#FFFFFF;strokeColor=#000000;fontSize=16;" value="Locked" vertex="1">
          <mxGeometry height="70" width="190" x="1120" y="440" as="geometry" />
        </mxCell>
        <mxCell id="vexit" parent="1" style="rounded=1;whiteSpace=wrap;html=1;arcSize=20;fillColor=#FFFFFF;strokeColor=#000000;fontSize=16;verticalAlign=top;spacingTop=12;" value="Validator Exiting&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot;&gt;exiting validators &amp;gt; 0&lt;/font&gt;" vertex="1">
          <mxGeometry height="84" width="240" x="1560" y="800" as="geometry" />
        </mxCell>
        <mxCell id="delexpired" parent="1" style="rounded=1;whiteSpace=wrap;html=1;arcSize=20;fillColor=#FFFFFF;strokeColor=#000000;fontSize=16;" value="Delegate&lt;br&gt;Expired" vertex="1">
          <mxGeometry height="74" width="170" x="700" y="1080" as="geometry" />
        </mxCell>
        <mxCell id="diamond" parent="1" style="rhombus;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#000000;fontSize=14;" value="exiting &amp;gt; 0" vertex="1">
          <mxGeometry height="120" width="170" x="1595" y="1170" as="geometry" />
        </mxCell>
        <mxCell id="e_init" edge="1" parent="1" source="init_dot" style="endArrow=classic;html=1;strokeColor=#333333;" target="uninit" value="">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e_deploy" edge="1" parent="1" source="uninit" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;" target="initialised" value="deploy / add first validator&#xa;(node operator)">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e_distribute" edge="1" parent="1" source="initialised" style="edgeStyle=orthogonalEdgeStyle;rounded=0;endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0.15;exitY=0;exitDx=0;exitDy=0;entryX=0.3;entryY=0;entryDx=0;entryDy=0;" target="initialised" value="distribute rewards&#xa;(anyone)">
          <mxGeometry relative="1" x="0.0194" y="30" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="685" y="700" />
              <mxPoint x="730" y="700" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e_claim" edge="1" parent="1" source="initialised" style="edgeStyle=orthogonalEdgeStyle;rounded=0;endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0.4;exitY=0;exitDx=0;exitDy=0;entryX=0.55;entryY=0;entryDx=0;entryDy=0;" target="initialised" value="claim funds&#xa;(node operator)">
          <mxGeometry relative="1" x="-0.0301" y="25" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="760" y="745" />
              <mxPoint x="805" y="745" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e_reducebond" edge="1" parent="1" source="initialised" style="edgeStyle=orthogonalEdgeStyle;rounded=0;endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0.4;exitY=1;exitDx=0;exitDy=0;entryX=0.55;entryY=1;entryDx=0;entryDy=0;" target="initialised" value="reduce bond&#xa;(node operator)">
          <mxGeometry relative="1" x="-0.0981" y="-25" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="760" y="985" />
              <mxPoint x="805" y="985" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e_repaydebt" edge="1" parent="1" source="initialised" style="edgeStyle=orthogonalEdgeStyle;rounded=0;endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0.65;exitY=1;exitDx=0;exitDy=0;entryX=0.8;entryY=1;entryDx=0;entryDy=0;" target="initialised" value="repay debt&#xa;(anyone)">
          <mxGeometry relative="1" x="0.0163" y="-20" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="835" y="980" />
              <mxPoint x="880" y="980" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e_expired" edge="1" parent="1" source="initialised" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.088;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" target="delexpired" value="expired&#xa;(anyone)">
          <mxGeometry relative="1" x="-0.0138" y="-35" as="geometry">
            <mxPoint as="offset" />
            <mxPoint x="715" y="1070" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="e_upgrade" edge="1" parent="1" source="delexpired" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" target="initialised" value="upgrade&#xa;(anyone)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="610" y="1117" />
              <mxPoint x="610" y="860" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e_challenge" edge="1" parent="1" source="initialised" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0.7;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="locked" value="challenge exiting&#xa;(oDAO member after notify threshold)">
          <mxGeometry relative="1" x="0.2679" y="45" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="850" y="475" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e_notnotexiting" edge="1" parent="1" source="locked" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="initialised" value="notify not exiting&#xa;(decrements locked validators)">
          <mxGeometry relative="1" x="-0.3985" y="96" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="1215" y="730" />
              <mxPoint x="865" y="730" />
            </Array>
            <mxPoint x="890" y="800" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="e_notifyexit_init" edge="1" parent="1" source="initialised" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="vexit" value="notify exit&#xa;(increments exiting validators)">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e_notifyexit_locked" edge="1" parent="1" source="locked" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="vexit" value="notify exit&#xa;(increments exiting validators and decrements locked validators)">
          <mxGeometry relative="1" x="0.0335" y="55" as="geometry">
            <mxPoint x="50" y="31" as="offset" />
            <Array as="points">
              <mxPoint x="1680" y="475" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e_finalbalance" edge="1" parent="1" source="vexit" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="diamond" value="notify final balance&#xa;(decrements exiting validators)">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e_yes" edge="1" parent="1" source="diamond" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" target="vexit" value="Yes">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1850" y="1230" />
              <mxPoint x="1850" y="884" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e_no" edge="1" parent="1" source="diamond" style="endArrow=classic;html=1;strokeColor=#333333;fontSize=13;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.95;entryY=1;entryDx=0;entryDy=0;" target="initialised" value="No">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="925" y="1230" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="n_uninit" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFF2CC;strokeColor=#D6B656;align=left;verticalAlign=top;spacingLeft=8;spacingTop=6;fontSize=13;shadow=1;" value="&lt;b&gt;Uninitialised&lt;/b&gt;&lt;br&gt;- Megapool address is deterministic&lt;br&gt;- Contract code has not been deployed to that address" vertex="1">
          <mxGeometry height="150" width="250" x="120" y="560" as="geometry" />
        </mxCell>
        <mxCell id="n_init" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFF2CC;strokeColor=#D6B656;align=left;verticalAlign=top;spacingLeft=8;spacingTop=6;fontSize=13;shadow=1;" value="&lt;b&gt;Initialised&lt;/b&gt;&lt;br&gt;- Contract code has been deployed&lt;br&gt;- Megapool assigned to owner node operator&lt;br&gt;- Rewards can be distributed - split between rETH holders and node operator&lt;br&gt;- Rewards can be claimed by node operator&lt;br&gt;- If bond requirements are changed by pDAO, node operator can reduce bond and recover credit&lt;br&gt;- If debt is incurred, someone can pay back the debt directly using &lt;i&gt;repayDebt&lt;/i&gt;" vertex="1">
          <mxGeometry height="210" width="320" x="370" y="180" as="geometry" />
        </mxCell>
        <mxCell id="n_locked" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFF2CC;strokeColor=#D6B656;align=left;verticalAlign=top;spacingLeft=8;spacingTop=6;fontSize=13;shadow=1;" value="&lt;b&gt;Locked&lt;/b&gt;&lt;br&gt;- A validator&#39;s exit has been challenged by an oDAO member&lt;br&gt;- Locks reward distribution&lt;br&gt;- Resolved by either notifyExit (proving exit) or notifyNotExit (proving not exiting)" vertex="1">
          <mxGeometry height="200" width="320" x="1120" y="180" as="geometry" />
        </mxCell>
        <mxCell id="n_vexit" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFF2CC;strokeColor=#D6B656;align=left;verticalAlign=top;spacingLeft=8;spacingTop=6;fontSize=13;shadow=1;" value="&lt;b&gt;Validator Exiting&lt;/b&gt;&lt;br&gt;- A validator is exiting&lt;br&gt;- Awaiting capital to be returned&lt;br&gt;- All reward distribution is blocked while any validators are in the exiting state" vertex="1">
          <mxGeometry height="120" width="290" x="1880" y="760" as="geometry" />
        </mxCell>
        <mxCell id="n_delexpired" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFF2CC;strokeColor=#D6B656;align=left;verticalAlign=top;spacingLeft=8;spacingTop=6;fontSize=13;shadow=1;" value="&lt;b&gt;Delegate Expired&lt;/b&gt;&lt;br&gt;- Current megapool delegate has passed the maximum upgrade window&lt;br&gt;- Delegate auto-upgrades on next interaction&lt;br&gt;- Anyone can trigger an expired delegate to upgrade" vertex="1">
          <mxGeometry height="160" width="320" x="540" y="1260" as="geometry" />
        </mxCell>
        <mxCell id="n_reduced" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFF2CC;strokeColor=#D6B656;align=left;verticalAlign=top;spacingLeft=8;spacingTop=6;fontSize=13;shadow=1;" value="&lt;b&gt;Reduced Bond&lt;/b&gt;&lt;br&gt;Preconditions:&lt;br&gt;• no debt&lt;br&gt;• no queued validators&lt;br&gt;• no prestaked validators" vertex="1">
          <mxGeometry height="160" width="250" x="960" y="1260" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
