**CropJoin Collateral and Rewards in End Process** * `End.skim` (cancel cdp debt): * Performs `vat.grab(ilk, urn, address(this), address(vow), -int256(wad), -int256(art))` * Results in moving gems to End (address(this) above). * Similarly to `Dog.grab` and `ProxyManagerClipper.kick`'s call to `Cropper.onLiquidation`, `CropJoin.stake` shares can potentially be moved to `End` using `Cropper.tack`. * If we would have tacked all the skims then later on, in `cash` stage, dai holders will be able to also get rewards in exchange to dai. * However the vault holder does not have an incentive to do the `tack` to `End`, and there is no system contract doing it, so it will need to be done by a system keeper from offchain before the waiting period ends. * If only part of the skims are tacked the `END` will not have enough shares and some exit attempts will fail in `cash` stage. * `End.free` (remove collateral from the caller's CDP): * Performs `vat.grab(ilk, msg.sender, msg.sender, address(vow), -int256(ink), `0); * Here gems are free but remain in the vault owner's possession. * No need to tack since `stake` is always considered as both free gem (`gem`) and locked gem (`ink`). * `End.cash` (exchange some dai from your bag for gems from a specific ilk): * Performs `vat.flux(ilk, address(this), msg.sender, rmul(wad, fix[ilk])); * Can be followed by `tack` to also get `stake` (reward rights). * The `tack` will work only if all `skim`ed vaults were followed by `tack`. **Cropper and Proxy Actions Considerations** * `Cropper.quit` (used before `End.free` since it works on non-proxied vaults): * Conceptually requires a `tack`, but since the freed gems will most likely be `Vat.flux`ed back to the caller's `urp` (so they can be `Cropper.exit`ed) there would probably be a `tack` in the opposite direction right away (making both redundant). * Hence `tack` is not put as part of `Cropper.quit`, but can still be called permissionlessly. * `DssProxyActionsEndCropper.freeGem` (frees the position through the end contract and exits the collateral): * Does not `tack` caller's funds because of the considerations detailed above. * Does not `tack` following calling `skim` since it does not have motivation to do so. * `DssProxyActionsEndCropper.cashGem` (exchange dai for gems and exit them): * Does not `tack` from End since there is no guarantee all End's gems were also `tack`ed to it following `skim` operations. * Instead uses `flee`, as in any case rewards could have been drained right before the `skim` calls. * Because of the above `cashGem` exits directly to `msg.sender` as it is not expected to get rewards (so no need to follow the paradigm that rewards are moved to the ds-proxy).