Consider checking adapter existence in MetaSwap
`MetaSwap` doesn't check that an adapter exists before calling into Spender:\\n```\\nfunction swap(\\n    string calldata aggregatorId,\\n    IERC20 tokenFrom,\\n    uint256 amount,\\n    bytes calldata data\\n) external payable whenNotPaused nonReentrant {\\n    Adapter storage adapter = adapters[aggregatorId];\\n\\n    if (address(tokenFrom) != Constants.ETH) {\\n        tokenFrom.safeTransferFrom(msg.sender, address(spender), amount);\\n    }\\n\\n    spender.swap{value: msg.value}(\\n        adapter.addr,\\n```\\n\\nThen `Spender` performs the check and reverts if it receives `address(0)`.\\n```\\nfunction swap(address adapter, bytes calldata data) external payable {\\n    require(adapter != address(0), "ADAPTER\\_NOT\\_SUPPORTED");\\n```\\n\\nIt can be difficult to decide where to put a check like this, especially when the operation spans multiple contracts. Arguments can be made for either choice (or even duplicating the check), but as a general rule it's a good idea to avoid passing invalid parameters internally. Checking for adapter existence in `MetaSwap.swap()` is a natural place to do input validation, and it means `Spender` can have a simpler model where it trusts its inputs (which always come from MetaSwap).
Drop the check from `Spender.swap()` and perform the check instead in `MetaSwap.swap()`.
```\\nfunction swap(\\n    string calldata aggregatorId,\\n    IERC20 tokenFrom,\\n    uint256 amount,\\n    bytes calldata data\\n) external payable whenNotPaused nonReentrant {\\n    Adapter storage adapter = adapters[aggregatorId];\\n\\n    if (address(tokenFrom) != Constants.ETH) {\\n        tokenFrom.safeTransferFrom(msg.sender, address(spender), amount);\\n    }\\n\\n    spender.swap{value: msg.value}(\\n        adapter.addr,\\n```\\n