Vault.sol: `settle`ing the 0 address will disrupt accounting
Within `Vault#_loadContext` function, the context.global is the account of the 0 address, while context.local is the account of the address to be updated or settled:\\n```\\nfunction _loadContext(address account) private view returns (Context memory context) {\\n    // rest of code\\n    context.global = _accounts[address(0)].read();\\n    context.local = _accounts[account].read();\\n    context.latestCheckpoint = _checkpoints[context.global.latest].read();\\n}\\n```\\n\\nIf a user settles the 0 address, the global account will be updated with wrong data.\\nHere is the _settle logic:\\n```\\nfunction _settle(Context memory context) private {\\n    // settle global positions\\n    while (\\n        context.global.current > context.global.latest &&\\n        _mappings[context.global.latest + 1].read().ready(context.latestIds)\\n    ) {\\n        uint256 newLatestId = context.global.latest + 1;\\n        context.latestCheckpoint = _checkpoints[newLatestId].read();\\n        (Fixed6 collateralAtId, UFixed6 feeAtId, UFixed6 keeperAtId) = _collateralAtId(context, newLatestId);\\n        context.latestCheckpoint.complete(collateralAtId, feeAtId, keeperAtId);\\n        context.global.processGlobal(\\n            newLatestId,\\n            context.latestCheckpoint,\\n            context.latestCheckpoint.deposit,\\n            context.latestCheckpoint.redemption\\n        );\\n        _checkpoints[newLatestId].store(context.latestCheckpoint);\\n    }\\n\\n    // settle local position\\n    if (\\n        context.local.current > context.local.latest &&\\n        _mappings[context.local.current].read().ready(context.latestIds)\\n    ) {\\n        uint256 newLatestId = context.local.current;\\n        Checkpoint memory checkpoint = _checkpoints[newLatestId].read();\\n        context.local.processLocal(\\n            newLatestId,\\n            checkpoint,\\n            context.local.deposit,\\n            context.local.redemption\\n        );\\n    }\\n}\\n```\\n\\nIf settle is called on 0 address, _loadContext will give context.global and context.local same data. In the _settle logic, after the global account(0 address) is updated with the correct data in the `while` loop(specifically through the processGlobal function), the global account gets reupdated with wrong data within the `if` statement through the processLocal function.\\nWrong assets and shares will be recorded. The global account's assets and shares should be calculated with toAssetsGlobal and toSharesGlobal respectively, but now, they are calculated with toAssetsLocal and toSharesLocal.\\ntoAssetsGlobal subtracts the globalKeeperFees from the global deposited assets, while toAssetsLocal subtracts globalKeeperFees/Checkpoint.count fees from the local account's assets.\\nSo in the case of settling the 0 address, where global account and local account are both 0 address, within the while loop of _settle function, depositedAssets-globalKeeperFees is recorded for address(0), but then, in the `if` statement, depositedAssets-(globalAssets/Checkpoint.count) is recorded for address(0)\\nAnd within the `Vault#_saveContext` function, context.global is saved before context.local, so in this case, context.global(which is 0 address with correct data) is overridden with context.local(which is 0 address with wrong data).
I believe that the ability to settle the 0 address is intended, so an easy fix is to save local context before saving global context: Before:\\n```\\n    function _saveContext(Context memory context, address account) private {\\n        _accounts[address(0)].store(context.global);\\n        _accounts[account].store(context.local);\\n        _checkpoints[context.currentId].store(context.currentCheckpoint);\\n    }\\n```\\n\\nAfter:\\n```\\n    function _saveContext(Context memory context, address account) private {\\n        _accounts[account].store(context.local);\\n        _accounts[address(0)].store(context.global);\\n        _checkpoints[context.currentId].store(context.currentCheckpoint);\\n    }\\n```\\n
The global account will be updated with wrong data, that is, global assets and shares will be higher than it should be because lower keeper fees was deducted.
```\\nfunction _loadContext(address account) private view returns (Context memory context) {\\n    // rest of code\\n    context.global = _accounts[address(0)].read();\\n    context.local = _accounts[account].read();\\n    context.latestCheckpoint = _checkpoints[context.global.latest].read();\\n}\\n```\\n