Tokens received from Curve's `remove_liquidity()` should be added to the assets list even if `_min_amounts` are set to `0`
Curve controller's `canRemoveLiquidity()` should return all the underlying tokens as `tokensIn` rather than only the tokens with `minAmount > 0`.\\n```\\nfunction canRemoveLiquidity(address target, bytes calldata data)\\n    internal\\n    view\\n    returns (bool, address[] memory, address[] memory)\\n{\\n    (,uint256[2] memory amounts) = abi.decode(\\n        data[4:],\\n        (uint256, uint256[2])\\n    );\\n\\n    address[] memory tokensOut = new address[](1);\\n    tokensOut[0] = target;\\n\\n    uint i; uint j;\\n    address[] memory tokensIn = new address[](2);\\n    while(i < 2) {\\n        if(amounts[i] > 0)\\n            tokensIn[j++] = IStableSwapPool(target).coins(i);\\n        unchecked { ++i; }\\n    }\\n    assembly { mstore(tokensIn, j) }\\n\\n    return (true, tokensIn, tokensOut);\\n}\\n```\\n\\nThe `amounts` in Curve controller's `canRemoveLiquidity()` represent the "Minimum `amounts` of underlying coins to receive", which is used for slippage control.\\nAt L144-149, only the tokens that specified a minAmount > 0 will be added to the `tokensIn` list, which will later be added to the account's assets list.\\nWe believe this is wrong as regardless of the minAmount `remove_liquidity()` will always receive all the underlying tokens.\\nTherefore, it should not check and only add the token when it's minAmount > 0.
`canRemoveLiquidity()` can be changed to:\\n```\\nfunction canRemoveLiquidity(address target, bytes calldata data)\\n    internal\\n    view\\n    returns (bool, address[] memory, address[] memory)\\n{\\n    address[] memory tokensOut = new address[](1);\\n    tokensOut[0] = target;\\n\\n    address[] memory tokensIn = new address[](2);\\n    tokensIn[0] = IStableSwapPool(target).coins(0);\\n    tokensIn[1] = IStableSwapPool(target).coins(1);\\n    return (true, tokensIn, tokensOut);\\n}\\n```\\n\\nSentiment Team\\nFixed as recommended. PR here.\\nLead Senior Watson\\nConfirmed fix.
When the user set `_min_amounts` = `0` while removing liquidity from `Curve` and the withdrawn tokens are not in the account's assets list already, the user may get liquidated sooner than expected as `RiskEngine.sol#_getBalance()` only counts in the assets in the assets list.
```\\nfunction canRemoveLiquidity(address target, bytes calldata data)\\n    internal\\n    view\\n    returns (bool, address[] memory, address[] memory)\\n{\\n    (,uint256[2] memory amounts) = abi.decode(\\n        data[4:],\\n        (uint256, uint256[2])\\n    );\\n\\n    address[] memory tokensOut = new address[](1);\\n    tokensOut[0] = target;\\n\\n    uint i; uint j;\\n    address[] memory tokensIn = new address[](2);\\n    while(i < 2) {\\n        if(amounts[i] > 0)\\n            tokensIn[j++] = IStableSwapPool(target).coins(i);\\n        unchecked { ++i; }\\n    }\\n    assembly { mstore(tokensIn, j) }\\n\\n    return (true, tokensIn, tokensOut);\\n}\\n```\\n