```\nfunction lock(\n    uint128 lockId,\n    address tokenAddress,\n    bytes32 recipient,\n    bytes4 destination,\n    uint256 amount\n) external isActive {\n    (uint256 amountToLock, uint256 fee, TokenInfo memory tokenInfo) = _createLock(\n        lockId,\n        tokenAddress,\n        amount,\n        recipient,\n        destination\n    );\n\n    require(tokenInfo.tokenStatus == TokenStatus.Enabled, "Bridge: disabled token");\n\n    if (tokenInfo.tokenType == TokenType.Native) {\n        // If token is native - transfer tokens from user to contract\n        IERC20(tokenAddress).safeTransferFrom(\n            msg.sender,\n            address(this),\n            amountToLock\n        );\n    } else if (tokenInfo.tokenType == TokenType.Wrapped) {\n        // If wrapped then butn the token\n        WrappedToken(tokenAddress).burn(msg.sender, amountToLock);\n    } else if (tokenInfo.tokenType == TokenType.WrappedV0) {\n        // Legacy wrapped tokens burn\n        IWrappedTokenV0(tokenAddress).burn(msg.sender, amountToLock);\n    } else {\n        revert("Bridge: invalid token type");\n    }\n\n    if (fee > 0) {\n        // If there is fee - transfer it to fee collector address\n        IERC20(tokenAddress).safeTransferFrom(\n            msg.sender,\n            feeCollector,\n            fee\n        );\n    }\n}\n```\n